Namespaces
Variants

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)

만약 pos < size()이 false이면 동작이 정의되지 않습니다.

(C++26까지)

만약 pos < size()이 false이면:

  • 구현이 강화된 경우, 계약 위반이 발생합니다.
  • 구현이 강화되지 않은 경우, 동작이 정의되지 않습니다.
(C++26부터)
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와 다르게 구현될 수 있습니다. 이 경우, 대체 타입은 다음 속성을 가집니다:

  • 모든 const std::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) 에 대해 유효하지 않은 서브셋이 지정된 경우
동작이 불명확했음
이 경우 동작은
정의되지 않음