C++ vector와 valarray, 그리고 array 중 뭘 써야 할까?

프로그래밍/C++ 2019.11.07 댓글 Plorence

이 클래스들은 서로 다른 목적을 가지고 서로 다른 그룹들에 의해 개발되었습니다.

먼저 vector 템플릿 클래스는 컨테이너 클래스와 알고리즘으로 구성된 시스템의 일부입니다.

vector 클래스는 정렬, 삽입, 재배치, 검색, 다른 컨테이너로의 데이터 전송, 그 밖의 조작과 같은 컨테이너 지향적인 액티비티들을 지원합니다.

 

반면에 valarray 템플릿 클래스는 수치 계산을 지향하며 STL의 일부가 아닙니다.

(valarray 템플릿 클래스은 push_back(), insert() 메서드를 가지고 있지 않음.)

그러나 많은 수학적 연산에 대해 간단하고 직관적인 인터페이스를 제공합니다.

valarray 템플릿 클래스은 객체의 내용을 합하는 sum() 메서드, 최댓값을 리턴하는 max() 메서드, 최솟값을 리턴하는 min() 메서드를 제공합니다.

 

마지막으로 array는 기존 배열형을 대체하기 위해 설계되었습니다.

고정된 크기를 가지는 경우에 array는 push_back()과 insert()를 지원하지 않습니다.

그러나 다양한 STL 메서드들을 지원하기 때문에 array 객체에 STL 알고리즘을 쉽게 적용할 수 있습니다.

정적 배열이기 때문에 구체화할 때 배열 길이도 함께 전달해줘야합니다.

#include <iostream>
#include <array>
int main(void) {
	std::array<int, 100> arr;
}

 

valarray 객체와 STL 알고리즘

valarray 클래스에는 begin()과 end() 메서드가 없습니다. 그래서 범위 매개변수로 사용할 수 없습니다.

C++11에서의 해결책은 begin()과 end() 템플릿 함수의 매개변수로 valarray 객체를 취하는 것입니다.

#include <iostream>
#include <valarray>
#include <algorithm>
int main(void) {
       std::valarray<int> val = std::valarray<int>(10);
       val[0] = 10;
       val[1] = 40;
       val[2] = 3;
       std::sort(std::begin(val), std::end(val));
       for (auto i : val) {
              std::cout << i << " ";
       }
}
0 0 0 0 0 0 0 3 10 40

댓글