[C++ STL] '시퀀스 컨테이너 - vector'
STL은 '표준 C++ 라이브러리'의 일부분으로 '표준 템플릿 라이브러리'를 말합니다. STL은 프로그램에 필요한 '자료구조'와 '알고리즘'을 '템플릿' 형식으로 제공해주는 라이브러리입니다. 해당 포스팅에서는 '배열 기반 시퀀스 컨테이너'에 대해 다룹니다.
먼저 '컨테이너(Container)'의 정의는 다음과 같습니다.
컨테이너: 객체를 저장하는 객체
정리하면 종류는 다음과 같이 나뉩니다.
먼저, vector 컨테이너를 예로들면 다음과 같은 모양입니다.
vector 컨테이너의 간단한 예제를 살펴보겠습니다
#include <iostream>
#include <vector>
using namespace std;
void main() {
// int 타입의 값을 저장하는 vector 컨테이너를 생성합니다.
vector<int> v;
v.push_back(10); // v에 '10'을 추가합니다.
v.push_back(20); // v에 '20'을 추가합니다.
v.push_back(30); // v에 '30'을 추가합니다.
v.push_back(40); // v에 '40'을 추가합니다.
v.push_back(50); // v에 '50'을 추가합니다.
for (unsigned int i = 0; i < v.size(); ++i)
cout << v[i] << endl;
}
STL에서 가장 많이 쓰이고 대표적인 vector 컨테이너의 생성자와 지원하는 멤버 함수를 자세히 알아보겠습니다. 양이 많아보이지만 기본적인 기능들이 많기 때문에 쉽게 파악하실 수 있습니다. vector 컨테이너를 이렇게 자세히 알아보는 이유는 STL에서 제공하는 다른 컨테이너들도 비슷비슷하기 때문입니다.
생성자 | |
vector v | v는 빈 컨테이너입니다. |
vector v{ n } | v는 기본값으로 초기화된 n개의 원소를 갖습니다. |
vector v{ n, x } | v는 x값으로 초기화된 n개의 원소를 갖습니다. |
vector v{ v2 } | v는 v2 컨테이너의 복사본입니다.(복사 생성자 호출) |
vector v{ b, e } | v는 반복자 구간 [b, e)로 초기화된 원소를 갖습니다. |
멤버 함수 | |
v.assign(n, x) | v에 x값으로 n개의 원소를 할당합니다. |
v.assign(b, e) | v를 반복자 구간 [b, e)로 할당합니다. |
v.at(i) | v의 i번째 원소를 참조합니다. |
v.front() | v의 첫 번째 원소를 참조합니다. |
v.back() | v의 마지막 원소를 참조합니다. |
v.begin() | v의 첫 원소를 가리키는 반복자를 반환합니다. |
v.end() | v의 끝 원소의 다음을 가리키는 반복자를 반환합니다. |
v.size() | v의 원소의 개수를 반환합니다. |
v.max_size() | v가 최대로 담을 수 있는 원소의 개수를 반환합니다. |
v.capacity() | v에 할당된 공간의 크기를 반환합니다. |
v.clear() | v의 모든 원소를 제거합니다. |
v.empty() | v가 비었는지 확인합니다. |
v.erase(p) | p가 가리키는 원소를 제거한 후, 다음 원소의 위치를 가진 반복자(iterator)를 반환합니다 |
v.erase(b, e) | 반복자 구간 [b, e)의 모든 원소를 제거합니다. 마찬가지로 다음 원소의 위치를 가진 반복자를 반환합니다. |
v.insert(p, x) | p가 가리키는 위치에 x값을 삽입합니다. |
v.insert(p, n, x) | p가 가리키는 위치에 n개의 x값을 삽입합니다. |
v.insert(p, b, e) | p가 가리키는 위치에 반복자 구간 [b, e)의 원소를 삽입합니다. |
v.push_back(x) | v의 끝에 x를 추가합니다. |
v.pop_back() | v의 마지막 원소를 제거합니다. |
v.swap(v2) | v와 v2를 스왑합니다. |
vector 컨테이너에 대해 알아두어야할 중요한 점으로는, vector 컨테이너는 배열 기반 컨테이너이므로 연속한 메모리를 한 번에 할당합니다. 우리가 이미 알고 있듯이 할당된 배열의 크기를 넘어 원소를 추가하려하면 기존의 할당된 크기보다 더 큰 크기의 배열을 할당한 후 기존 배열의 값을 복사하는 식으로 사용할 수 있습니다. 그리고 vector 컨테이너는 push_back() 멤버 함수를 통해 원소를 계속해서 추가해 나갈 수 있습니다. 원소를 계속 추가해나갈 때, vector 컨테이너는 기존의 할당된 메모리 크기로 부족하다 판단되면 더 큰 크기로 메모리를 재할당한 후 기존에 있던 값은 복사하는 과정을 거칩니다. 이때, 재할당에 드는 성능 문제를 보완하고자 만들어진 개념이 'capacity'입니다.
반복자(iterator)를 사용하여 vector 컨테이너의 원소를 출력하는 예제입니다.
#include <iostream>
#include <vector>
using namespace std;
void main() {
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
for (auto i = 0; i < v.size(); ++i)
cout << v[i] << " "; // vector, deque 컨테이너는 [] 연산자를 사용할 수 있습니다.
cout << endl;
for (auto iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " ";
cout << endl;
}
'Programming > C C++' 카테고리의 다른 글
[C++ STL] '연관 컨테이너 - set' (0) | 2019.05.27 |
---|---|
[C++ STL] '시퀀스 컨테이너 - list' (0) | 2019.05.27 |
[C++ 문법] 'friend' 예약어 (0) | 2019.05.24 |
[C++ 문법] '추상 클래스' (0) | 2019.05.24 |
[C++ 문법] '소멸자 가상화' (0) | 2019.05.24 |
댓글
이 글 공유하기
다른 글
-
[C++ STL] '연관 컨테이너 - set'
[C++ STL] '연관 컨테이너 - set'
2019.05.27 -
[C++ STL] '시퀀스 컨테이너 - list'
[C++ STL] '시퀀스 컨테이너 - list'
2019.05.27 -
[C++ 문법] 'friend' 예약어
[C++ 문법] 'friend' 예약어
2019.05.24 -
[C++ 문법] '추상 클래스'
[C++ 문법] '추상 클래스'
2019.05.24