본문 바로가기

Algorithm/A. Intro & STL

15. Valarray

valarray는 수치적 사용을 목적으로 하는 배열 형태의 수들을 관리할 수 있는 유사 컨테이너이다. 헤더파일 <valarray>를 인클루드하면 valarray를 사용할 수 있다. 이 헤더파일에는 클래스 valarray가 정의되어 있다.

 

valarray의 선언 방식은 다른 STL과 별로 다르지 않다.

1. valarray<int> v;
2. valarray<int> v(n);
3. valarray<int> v(x,n);
4. valarray<int> v(w,n);
5. valarray<int> v({a1,a2,...,an});

1번은 빈 컨테이너를 선언하는 코드이다. 2번과 3번같이 선언하면 길이가 $n$인 컨테이너가 생성되는데, 3번과 같이 선언하면 각각의 요소는 $x$로 초기화된다. $x$를 생략하고 2번과 같이 선언하면 각각의 요소는 기본값으로 초기화된다. 4번은 $w$의 처음 $n$개 원소로 $v$를 생성하는 방법이다. 5번은 C++11 표준이며 인자로 주어진 $n$개의 값으로 $v$를 생성한다.

 

valarray에 오버로딩된 연산자들은 모든 요소의 값을 한 번에 변경할 수 있게 한다. 아래 예시와 같이 반복문을 쓰지 않고 모든 요소의 값을 변경할 수 있다.

------------------------------------------------------------

#import<bits/stdc++.h>
using namespace std;
main()
{
    valarray<int> v=({0,1,2,3,4});
    
    for(int i = 0; i < 5; i++)cout << v[i] << ' ';
    cout << endl;
    
    v += 3;
    
    for(int i = 0; i < 5; i++)cout << v[i] << ' ';
    cout << endl;
}

------------------------------------------------------------

Output

0 1 2 3 4
3 4 5 6 7

------------------------------------------------------------

이렇게 오버로딩된 연산자에는 +, -, ~, !, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=이 있다. (물론 =과 [] 연산자도 사용할 수 있다.) 일부 연산자는 자료형에 맞지 않을 경우 컴파일 에러가 발생한다.

 

valarray의 멤버 함수는 다음과 같다:

v.resize(n); v의 크기를 n으로 바꾸고 각각의 요소를 기본값으로 초기화한다.
v.resize(n,x); v의 크기를 n으로 바꾸고 각각의 요소를 x로 초기화한다.
v.size(); v에 포함된 요소의 수를 반환한다.
v.sum(); v의 모든 요소의 합을 반환한다.
v.max(); v의 요소의 최댓값을 반환한다.
v.min(); v의 요소의 최솟값을 반환한다.
v.shift(n); v의 요소를 각각 왼쪽으로 n만큼 시프트한다.
v.cshift(n); v의 요소를 각각 왼쪽으로 n만큼 시프트한다.
v.apply(f); v의 각각의 요소에 함수 f를 실행한다.
v.swap(w); v와 w를 맞바꾼다.

valarray::shift 함수와 valarray::cshift 함수의 차이점은 valarray::shift 함수는 valarray를 선형으로 간주하여 범위 밖으로 나가는 값들을 버리고 오른쪽에 비게 되는 요소를 기본값으로 초기화하지만 valarray::cshift 함수는 valarray를 원형으로 간주하여 범위 밖으로 나가는 값들을 오른쪽에 다시 채워 넣는다는 것이다. 아래 예제로 이해할 수 있다.

------------------------------------------------------------

#import<bits/stdc++.h>
using namespace std;
main()
{
    valarray<int> v({1,2,3,4,5});
    valarray<int> w({1,2,3,4,5});
    
    for(int i = 0; i < 5; i++)cout << v[i] << ' ';
    cout << endl;
    
    v = v.shift(2);
    
    for(int i = 0; i < 5; i++)cout << v[i] << ' ';
    cout << endl;
    
    w = w.cshift(2);
    
    for(int i = 0; i < 5; i++)cout << w[i] << ' ';
    cout << endl;
}

------------------------------------------------------------

Output

1 2 3 4 5
3 4 5 0 0
3 4 5 1 2

------------------------------------------------------------

또한 valarray::shift 함수와 valarray::cshift 함수는 valarray의 요소 자체를 시프트하는 것이 아니고 요소를 시프트한 결과로 생기는 valarray를 반환하는 식으로 작동하기 때문에 요소 자체를 시프트하려면 다시 대입을 해야 한다.

'Algorithm > A. Intro & STL' 카테고리의 다른 글

16. Span  (0) 2021.01.25
14. Bitset  (0) 2021.01.19
13. String  (0) 2021.01.17
12. Unordered Container  (0) 2021.01.15
11. Map & Multimap  (0) 2021.01.13