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) 멤버 함수로 변경

더 알아보기 (Learn more)

cppreference