numeric_valarray
numeric_valarray (값 배열 클래스)
std::valarray는 값의 배열을 표현하고 조작하는 클래스예요. 요소별 수학 연산과 다양한 형태의 일반화된 첨자 연산자, 슬라이싱, 간접 접근을 지원해요.
출처: cppreference
본문
<valarray> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.
template< class T >
class valarray;
std::valarray는 값의 배열을 표현하고 조작하는 클래스예요. 요소별 수학 연산과 다양한 형태의 일반화된 첨자 연산자, 슬라이싱, 간접 접근을 지원해요.
템플릿 매개변수 (Template parameters)
- T — 요소의 타입. 이 타입은 NumericType 요구사항을 만족해야 해요.
멤버 타입 (Member types)
| 멤버 타입 | 정의 |
|---|---|
| value_type | T |
| iterator (C++11) | LegacyRandomAccessIterator 및 C++20부터 contiguous_iterator를 모델링하는 지정되지 않은 가변 반복자 타입. std::iterator_traits<iterator>::value_type은 T이고, reference는 T& |
| const_iterator (C++11) | 동일 요구사항의 지정되지 않은 상수 반복자 타입. reference는 const T& |
멤버 함수 (Member functions)
- (constructor) — 새 수치 배열을 생성해요 (공개 멤버 함수)
- (destructor) — 수치 배열을 파괴해요 (공개 멤버 함수)
- operator= — 내용을 할당해요 (공개 멤버 함수)
- operator[] — valarray 요소, 슬라이스 또는 마스크를 얻기/설정 (공개 멤버 함수)
- operator+ operator- operator~ operator! — 각 요소에 단항 산술 연산자를 적용 (공개 멤버 함수)
- operator+= operator-= operator*= operator/= operator%= operator&= operator|= operator^= operator<<= operator>>= — 각 요소에 복합 할당 연산자 적용 (공개 멤버 함수)
- swap — 다른 valarray와 교환 (공개 멤버 함수)
- size — valarray의 크기 반환 (공개 멤버 함수)
- resize — valarray의 크기 변경 (공개 멤버 함수)
- sum — 모든 요소의 합 계산 (공개 멤버 함수)
- min — 가장 작은 요소 반환 (공개 멤버 함수)
- max — 가장 큰 요소 반환 (공개 멤버 함수)
- shift — 요소를 0으로 채우며 시프트 (공개 멤버 함수)
- cshift — 요소를 순환 시프트 (공개 멤버 함수)
- apply — valarray의 모든 요소에 함수 적용 (공개 멤버 함수)
- begin (C++11) — valarray의 시작 반복자 획득 (공개 멤버 함수)
- end (C++11) — valarray의 끝 지나 반복자 획득 (공개 멤버 함수)
비멤버 함수 (Non-member functions)
- std::swap(std::valarray) (C++11) — std::swap 알고리즘 특수화 (함수 템플릿)
- operator+ operator- operator* operator/ operator% operator& operator| operator^ operator<< operator>> operator&& operator|| — 두 valarray의 각 요소 또는 valarray와 값에 이항 연산자 적용 (함수 템플릿)
- operator== operator!= operator< operator<= operator> operator>= — 두 valarray 또는 valarray와 값 비교 (함수 템플릿)
- abs(std::valarray) — 각 요소에 abs 함수 적용 (함수 템플릿)
- 지수 함수: exp, log, log10 (각 요소 적용)
- 거듭제곱 함수: pow, sqrt
- 삼각 함수: sin, cos, tan, asin, acos, atan, atan2
- 쌍곡 함수: sinh, cosh, tanh
헬퍼 클래스 (Helper classes)
- slice — valarray의 BLAS형 슬라이스: 시작 인덱스, 길이, 스트라이드 (클래스)
- slice_array — 슬라이스 적용 후 valarray의 하위 집합 프록시 (클래스 템플릿)
- gslice — valarray의 일반화된 슬라이스: 시작 인덱스, 길이 집합, 스트라이드 집합 (클래스)
- gslice_array — gslice 적용 후 하위 집합 프록시 (클래스 템플릿)
- mask_array — 불리언 마스크 operator[] 적용 후 하위 집합 프록시 (클래스 템플릿)
- indirect_array — 간접 operator[] 적용 후 하위 집합 프록시 (클래스 템플릿)
추론 가이드 (Deduction guides) (since C++17)
참고 (Notes)
std::valarray와 헬퍼 클래스는 특정 형태의 앨리어싱이 없도록 정의되어, C 언어의 restrict 키워드 효과와 유사하게 연산이 최적화될 수 있게 해요. 또한 valarray 인자를 받는 함수와 연산자는 프록시 객체를 반환할 수 있어서, v1 = a * v2 + v3; 같은 표현식을 v1[i] = a * v2[i] + v3[i];를 실행하는 단일 루프로 컴파일러가 최적화하게 해요. 임시 객체나 여러 번의 순회를 피하는 것이지요. 하지만 표현식 템플릿은 어떤 C++ 컨테이너에도 같은 최적화 기법을 사용할 수 있게 하므로, 대부분의 수치 라이브러리는 유연성 때문에 valarray 대신 표현식 템플릿을 선호해요. 일부 C++ 표준 라이브러리 구현(GNU libstdc++, LLVM libc++)은 std::valarray의 효율적인 연산에 표현식 템플릿을 사용해요. Intel Integrated Performance Primitives처럼 valarray를 더 최적화하는 경우는 드물어요.
| 피처 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_valarray |
202511L | (C++26) | (DR11) std::valarray의 begin/end 멤버 함수와 iterator/const_iterator 멤버 타입 |
- ¹ 2026-05-27 기준으로 libstdc++은 P3016R6의 begin/end 함수 변경을 C++11에 대한 결함 보고로 취급하지 않았고 C++26부터만 변경을 적용해요.
결함 보고 (Defect reports)
이전에 발표된 C++ 표준에 소급 적용된 동작 변경 결함 보고는 다음과 같아요.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P3016R6 | C++11 | 1) valarray에 iterator/const_iterator 멤버 타입이 없었음 2) 일관성 없는 비멤버 begin()/end() 함수가 있었음 | 1) 멤버 타입 추가 2) 멤버 함수로 변경 |