[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'set 컨테이너'는 key값 1개를 저장하는 형태의 노드 집합으로 이루어져 있습니다. 또한, key값은 중복이 될 수 없습니다. 만약 중복을 허용하고싶다면 'multiset 컨테이너'를 사용하셔야 합니다. 'set 컨테이너'뿐만 아니라 모든 연관 컨테이너(set, multiset, map, multimap)는 '균형 이진 트리'로 구현되어 있습니다. 'set 컨테이너' 내부의 모습은 다음과 같습니다. 다음으로 'set 컨테이너'가 제공하는 인터페이스를 알아보겠습니다. 모든 연관 컨테이너는 같은 인터페이스를 제공하기 때문에 하나만 제대로 익혀두면 나머지 것들에도 적용시킬 수 있습니다. 생성자(Constructor) set s s는 빈 컨테이너입니다. set s{ pred } s는 빈 컨테이너이고, 정렬 … -
[C++ STL] '시퀀스 컨테이너 - list'
[C++ STL] '시퀀스 컨테이너 - list'
2019.05.27list 컨테이너는 대표적인 자료구조 중 하나인 '연결 리스트'라고 생각하시면 됩니다. 다만, STL에서 제공하는 'list 컨테이너'는 '이중 연결 리스트'로 구현되어 있습니다. 컨테이너의 내부는 다음과 같습니다. 'list 컨테이너'의 주요 인터페이스를 정리해보겠습니다. 앞서 vector 컨테이너의 인터페이스와 유사한 인터페이스도 많지만, 'list 컨테이너'만의 특징적인 인터페이스도 많습니다. 생성자(Constructor) list lt lt는 빈 컨테이너입니다. list lt{ n } lt는 기본값으로 초기화된 n개의 원소를 갖습니다. list lt{ n, x } lt는 x값으로 초기화된 n개의 원소를 갖습니다. list lt{ lt2 } lt는 lt2 컨테이너의 복사본입니다.(복사 생성자 호출)… -
[C++ 문법] 'friend' 예약어
[C++ 문법] 'friend' 예약어
2019.05.24'friend' 예약어는 함수나 클래스 선언 앞에 작성할 수 있습니다. 'friend'로 선언한 함수나 클래스는 접근 제어 지시자의 영향을 받지 않습니다. 그리고 반드시 클래스 내부에서 friend 선언을 해야 합니다. class MyData { private: int m_nData = 0; public: MyData(int nParam) : m_nData{ nParam } { /* do somthing */ } int GetData() const { return m_nData; } void SetData(int nParam) { m_nData = nParam; } friend void PrintData(const MyData&); // PrintData() 함수는 이제 MyData 클래스의 친구입니다…. -
[C++ 문법] '추상 클래스'
[C++ 문법] '추상 클래스'
2019.05.24Java에서는 '추상 메서드'를 가진 클래스를 '추상 클래스'라고 말합니다. 용어만 다를뿐 C++도 같은 맥락입니다. C++에서는 '순수 가상 함수'를 가진 클래스를 '추상 클래스'라고 말합니다. 그렇다면 '순수 가상 함수'란 무엇일까요? '순수 가상 함수'란 선언은 지금하되 정의는 '자식 클래스'에 위임하는 함수입니다. '가상 함수' 선언 끝부분에 '=0'이라는 표기가 붙습니다. virtual int GetData() const = 0; '추상 클래스'의 장점은 자신을 상속 받을 여러 '자식 클래스'들의 인터페이스를 통일시켜줄 수가 있다는 것입니다. // 초기 제작자의 코드 class MyObject { protected: int m_nDeviceID; public: MyObject() { /* do …
댓글을 사용할 수 없습니다.