728x90
Original Source: https://devdocs.io/cpp/container/vector
DevDocs
devdocs.io
List
$ O(1) $ 시간 안에 임의의 위치의 원소 삽입, 삭제를 지원하는 container
보통 이중 연결 리스트로 구현됨
초기화
#include <list>
// int형 list 생성
std::list<int> li;
// 크기 10의 int형 list 생성
std::list<int> li(10);
// int형 list 생성 후 지정된 원소로 초기화
std::list<int> li = { 1, 2, 3, 4, 5 };
Element Access
- .front(): 첫 번째 원소에 접근
- .back(): 마지막 원소에 접근
Iterators
- .begin(): 첫 번째 원소를 가리키는 iterator 반환
- .end(): 마지막 원소의 뒤에 위치하는 원소를 가리키는 iterator 반환
범위 바깥의 원소를 가리키므로 접근하면 undefined behavior 발생
Capacity
- .empty(): container가 비었는지 확인
- .size(): 원소의 개수를 반환
Modifiers
- .clear(): 모든 원소 삭제
- .insert(): iterator가 가리키는 곳의 이전 위치에 원소 삽입
// iterator가 가리키는 곳 이전 위치에 5 삽입
li.insert(itr, 5);
// iterator가 가리키는 곳 이전 위치에 5를 2번 삽입
li.insert(itr, 2, 5);
- .erase(): iterator가 가리키는 위치에 있는 원소를 삭제하고 다음 원소의 주소를 반환
vector와는 다르게 iterator를 계속 사용하려면 반환되는 원소의 주소를 다시 할당해야 함
#include <list>
std::list<int> li = { 1, 2, 3, 4, 5 };
auto itr = li.begin(); // itr -> 1
itr++; // itr -> 2
itr = li.erase(itr); // li = { 1, 3, 4, 5 }, itr -> 3
- .push_front(): 맨 앞에 원소 삽입
- .push_back(): 맨 끝에 원소 삽입
- .pop_front(): 맨 앞에 있는 원소 삭제
- .pop_back(): 맨 끝에 있는 원소 삭제
- .swap(): 두 list를 서로 교체
// 두 list를 서로 교체
li1.swap(li2);
Stack
LIFO(last-in, first-out) 스택 자료구조를 구현한 container
초기화
#include <stack>
// int형 stack 생성
std::stack<int> s;
// 지정된 원소가 들어 있는 int형 stack 생성
std::stack<int> s({ 1, 2, 3, 4, 5 });
Element Access
- .top(): 맨 위의 원소에 접근
Capacity
- .empty(): container가 비었는지 확인
- .size(): 원소의 개수를 반환
Modifiers
- .push(): 맨 위에 원소 삽입
- .pop(): 맨 위에 있는 원소 삭제
- .swap(): 두 stack을 서로 교체
// 두 stack을 서로 교체
s1.swap(s2);
Queue
FIFO(last-in, first-out) 큐 자료구조를 구현한 container
초기화
#include <queue>
// int형 queue 생성
std::queue<int> q;
// 지정된 원소가 포함된 int형 queue 생성
std::queue<int> q({ 1, 2, 3, 4, 5 });
Element Access
- .front(): 첫 번째 원소에 접근
- .back(): 마지막 원소에 접근
Capacity
- .empty(): container가 비었는지 확인
- .size(): 원소의 개수를 반환
Modifiers
- .push(): 맨 끝에 원소 삽입
- .pop(): 첫 번째 원소 삭제
- .swap(): 두 queue를 서로 교체
// 두 queue를 서로 교체
q1.swap(q2);
Vector
동적 배열을 표현하는 sequence container 자료구조
초기화
#include <vector>
// int형 vector 생성
std::vector<int> v;
// 크기 10의 int형 vector 생성
std::vector<int> v(10);
// int형 vector 생성 후 지정된 원소로 초기화
std::vector<int> v = { 1, 2, 3, 4, 5 };
// int형 vector 배열 생성
std::vector<int> v[] = { { 1, 2 }, { 3, 4, 5 } };
// 2차원 vector 생성
std::vector< std::vector<int> > v = { { 1, 2 }, { 3, 4, 5 }};
Element Access
- .front(): 첫 번째 원소에 접근
- .back(): 마지막 원소에 접근
Iterators
- .begin(): 첫 번째 원소를 가리키는 iterator 반환
- .end(): 마지막 원소의 뒤에 위치하는 원소를 가리키는 iterator 반환
범위 바깥의 원소를 가리키므로 접근하면 undefined behavior 발생
Capacity
- .empty(): container가 비었는지 확인
- .size(): 원소의 개수를 반환
- .reserve(): 사용할 메모리 공간을 미리 예약함
vector의 크기를 바꾸지는 않는다.
// v의 메모리 사용 공간을 10으로 예약
v.reserve(10);
Modifiers
- .clear(): 모든 원소 삭제
- .insert(): iterator가 가리키는 곳의 이전 위치에 원소 삽입
// iterator가 가리키는 곳 이전 위치에 5 삽입
v.insert(itr, 5);
// iterator가 가리키는 곳 이전 위치에 5를 2번 삽입
v.insert(itr, 2, 5);
- .erase(): iterator가 가리키는 위치에 있는 원소를 삭제하고 다음 원소로 iterator를 옮김
#include <vector>
std::vector<int> v = { 1, 2, 3, 4, 5 };
auto itr = v.begin(); // itr -> 1
itr++; // itr -> 2
v.erase(itr); // v = { 1, 3, 4, 5 }, itr -> 3
- .push_back(): 맨 끝에 원소 삽입
- .pop_back(): 맨 끝에 있는 원소 삭제
- .resize(): container의 크기 변경
// v의 크기를 10으로 변경
v.resize(10);
- .swap(): 두 vector를 서로 교체
// 두 vector를 교체
v1.swap(v2);
Pair
두 개의 객체를 하나의 단위로 저장하는 class template
초기화
#include <utility>
// int형 pair 생성
pair<int, int> p;
p = make_pair(1, 2);
p = { 1, 2 }; // C++11 이상 사용 가능
// pair에 저장된 변수에 접근
int a = p.first; // a == 1
int b = p.second; // b == 2
// 다른 자료구조와 함께 사용
vector< pair<int, int> > v;
v.push_back({ 1, 2 });
queue< pair<int, int> > q;
q.push({ 1, 2 });
- .first: 첫 번째 객체에 접근
- .second: 두 번째 객체에 접근
- swap(): 두 pair를 서로 교체
// 두 pair를 교체
p1.swap(p2)
'C++' 카테고리의 다른 글
std::next_permutation() 사용법 정리 (0) | 2023.01.25 |
---|