Namespaces
Variants

std::valarray<T>:: operator[]

From 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 인 경우:

  • 구현이 hardened 된 경우, contract violation 이 발생합니다. 또한 계약 위반 핸들러가 "observe" 평가 의미론 하에 반환하는 경우, 동작은 정의되지 않습니다.
  • 구현이 hardened되지 않은 경우, 동작은 정의되지 않습니다.
(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 비상수 a 의 경우
2) & a [ i + j ] == & a [ i ] + j
  • 이는 std::valarray 요소들이 메모리에서 연속적으로 배치되어 있음을 의미합니다.
3) & a [ i ] ! = & b [ j ] 서로 별칭(alias)이 아닌 모든 객체 a b 에 대해
  • 이는 요소들 간에 별칭이 존재하지 않음을 의미하며, 이 속성을 활용하여 특정 종류의 최적화를 수행할 수 있습니다.

참조는 resize() 호출 시 또는 배열이 소멸될 때 무효화됩니다.

오버로드 (3,5,7,9) 의 경우, 이 함수는 반환 타입이 std::valarray 와 다르게 구현될 수 있습니다. 이 경우, 대체 타입은 다음 속성을 가집니다:

슬라이스/마스크/간접 인덱스 접근은 연쇄적으로 사용할 수 없습니다: 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) 에 대해 유효하지 않은 서브셋이 지정된 경우
동작이 불명확했음
이 경우 동작은
정의되지 않음