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 |