std::valarray<T>::operator[]
출처: ko.cppreference.net
const T& operator[]( std::size_t pos ) const;
|
(1) | |
T& operator[]( std::size_t pos );
|
(2) | |
std::valarray<T> operator[]( std::slice slicearr ) const;
|
(3) | |
std::slice_array<T> operator[]( std::slice slicearr );
|
(4) | |
std::valarray<T> operator[]( const std::gslice& gslicearr ) const;
|
(5) | |
std::gslice_array<T> operator[]( const std::gslice& gslicearr );
|
(6) | |
std::valarray<T> operator[]( const std::valarray<bool>& boolarr ) const;
|
(7) | |
std::mask_array<T> operator[]( const std::valarray<bool>& boolarr );
|
(8) | |
std::valarray<T> operator[]( const std::valarray<std::size_t>& indarr ) const;
|
(9) | |
std::indirect_array<T> operator[]( const std::valarray<std::size_t>& indarr );
|
(10) | |
배열의 단일 요소 또는 일부를 검색합니다.
요소 시퀀스를 반환하는 const 오버로드는 새로운 std::valarray 객체를 생성합니다.
비-const 오버로드는 배열 요소에 대한 참조를 보유하는 클래스를 반환합니다.
1,2)
3-10) 인수가
*this의 유효한 부분 집합을 지정하지 않으면 동작이 정의되지 않습니다.매개변수
| pos | - | 반환할 요소의 위치 |
| slicearr | - | slice 반환할 요소의 슬라이스 |
| gslicearr | - | gslice 반환할 요소의 gslice |
| boolarr | - | 반환할 요소의 마스크 |
| indarr | - | 반환할 요소의 인덱스들 |
반환값
1,2)
해당 요소에 대한 참조입니다.
3,5,7,9)
선택된 항목들의 복사본을 포함하는
std::valarray
객체.
4,6,8,10)
선택된 항목에 대한 참조를 포함하는 해당 데이터 구조.
예외
구현 정의 예외를 던질 수 있습니다.
참고
올바른 std::valarray 값 a, b 및 올바른 std::size_t 값 i, j에 대해, 다음 표현식은 항상 true으로 평가됩니다:
1)
(a[i] = q, a[i]) == q 비-const a에 대해 2)
&a[i + j] == &a[i] + j
- 이는 std::valarray 요소들이 메모리에서 인접함을 의미합니다.
3)
&a[i] != &b[j] 서로 별칭이 아닌 모든 객체 a 및 b에 대해
- 이는 요소에 별칭이 없으며, 이 속성을 사용하여 특정 종류의 최적화를 수행할 수 있음을 의미합니다.
참조는 resize()에서 또는 배열이 소멸될 때 무효화됩니다.
오버로드 (3,5,7,9)의 경우, 함수는 반환 타입이 std::valarray와 다르게 구현될 수 있습니다. 이 경우, 대체 타입은 다음 속성을 가집니다:
- 모든
conststd::valarray의 멤버 함수가 제공됩니다. - std::valarray, std::slice_array, std::gslice_array, std::mask_array 및 std::indirect_array는 대체 타입으로부터 생성될 수 있습니다.
const std::valarray<T>&를 인자로 받는 모든 함수(단, begin() 및 end()(C++11부터) 제외)에 대해, 대체 타입을 인자로 받는 동일한 함수가 추가되어야 합니다;- 두 개의
const std::valarray<T>&인자를 받는 모든 함수에 대해,const std::valarray<T>&와 대체 타입의 모든 조합을 인자로 받는 동일한 함수가 추가되어야 합니다. - 반환 타입은 가장 깊게 중첩된 인자 타입에 대해 두 단계 이상의 템플릿 중첩을 추가하지 않습니다.
슬라이스/마스크/간접 인덱스 접근은 체이닝되지 않습니다: v[v == n][std::slice(0, 5, 2)] = x;는 오류입니다. 왜냐하면 std::mask_array(v[v == n]의 타입)에는 operator[]가 없기 때문입니다.
예제
이 코드 실행
#include <cstddef> #include <iomanip> #include <iostream> #include <valarray> int main() { std::valarray<int> data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::cout << "초기 valarray: "; for (int n : data) std::cout << std::setw(3) << n; std::cout << '\n'; data[data > 5] = -1; // valarray<bool> overload of operator[] // the type of data > 5 is std::valarray<bool> // the type of data[data > 5] is std::mask_array<int> std::cout << "v[v > 5] = -1 후: "; for (std::size_t n = 0; n < data.size(); ++n) std::cout << std::setw(3) << data[n]; // regular operator[] std::cout << '\n'; }
출력:
초기 valarray: 0 1 2 3 4 5 6 7 8 9 v[v > 5] = -1 후: 0 1 2 3 4 5 -1 -1 -1 -1
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 389 | C++98 |
오버로드
(1)
의 반환 타입이
T
였음
|
const T & 로 수정됨 |
| LWG 430 | C++98 |
오버로드
(3-10) 에 대해 유효하지 않은 서브셋이 지정된 경우 동작이 불명확했음 |
이 경우 동작은
정의되지 않음 |