개요
C++에서는 동적 크기를 갖는 컨테이너로 표준 라이브러리의 vector를 사용할 수 있습니다.
vector<int> vc { 1, 2, 3, 4, 5 };
vector는 std:list와 매우 비슷하지만, 내부 구현 방식과 특성이 다르기 때문에 상황에 맞게 적절한 컨테이너를 사용해야 합니다. std::list의 주요 특징은 아래 링크의 글에서 자세히 확인할 수 있습니다.
[C++] std::list
개요 C++에서는 동적 크기를 갖는 컨테이너 배열로 표준 라이브러리의 list를 사용할 수 있습니다.list li { 1, 2, 3, 4, 5 }; list는 std::vector와 매우 비슷하지만, 내부 구현 방식과 특성이 다르기 때문
hyeokjunjjang.tistory.com
특징
- 동적 컨테이너 크기
- 요소를 추가하거나 삭제할 때 컨테이너의 크기가 자동으로 조절됩니다.
- capacity가 부족하면 더 큰 새로운 메모리 블록을 할당하고, 새 메모리 블록에 기존 데이터를 복사한 후, 기존 메모리 블록을 해제합니다.
- 임의 접근 지원
- 실제 데이터는 연속된 메모리에 저장되어 임의 인덱스 접근이 가능합니다.
- std::list에 비해 인덱스로 접근하는 속도가 빠릅니다.
- vector의 iterator는 ++, --, +N, -N 연산을 지원합니다.
- 잦은 삽입 및 삭제 지양
- 데이터가 연속된 메모리에 저장되므로, 중간 데이터를 삽입 및 삭제하려면 모든 요소의 이동이 필요합니다.
- 반면에 데이터의 이동이 필요없는 컨테이너의 끝(back) 부분에 대한 요소의 삽입(push_back) 및 삭제(pop_back)는 비교적 빠른 시간에 수행됩니다.
헤더
#include <vector>
vector를 사용하기 위해서 다음과 같이 <vector> 헤더를 포함해야 합니다.
선언 및 초기화
템플릿 매개변수
vector<_Ty, _Alloc = allocator<_Ty>> vec;
vector의 타입을 선언할 때, 최대 2개의 템플릿 매개변수를 받습니다.
- _Ty은 실제 데이터의 형식을 나타냅니다.
- _Alloc은 할당자(Allocator)를 나타내며 지정하지 않으면 기본 할당자가 사용됩니다.
생성자
vector<int> vec { 1, 2, 3, 4, 5 };
vector를 선언과 동시에 초기화하기 위해서 중괄호를 이용해 컨테이너의 초기 요소들을 설정할 수 있습니다.
크기와 초기값 지정
vector<_Ty> vec(_Count, _Value);
vector의 크기와 초기값을 설정합니다.
- _Count는 컨테이너의 크기를 나타냅니다.
- _Value는 요소의 초기값을 나타냅니다.
iterator 복사
vector<_Ty> vec(_First, _Last);
다른 컨테이너의 iterator를 이용하여 요소를 복사합니다.
- _First는 복사할 컨테이너의 첫 iterator를 나타냅니다.
- _Last는 복사할 컨테이너의 마지막 iterator를 나타냅니다.
vector 복사
vector<_Ty> vec(_Right);
다른 vector를 복사하여 새로운 vector를 생성합니다.
- _Right는 복사할 vector를 나타냅니다.
주요 함수
size()
vector<int> vec { 1, 2, 3, 4, 5, 6 };
size_t s = vec.size(); // 6을 반환합니다.
vector의 현재 크기를 반환합니다.
capacity()
vector<int> vec { 1, 2, 3, 4, 5 };
vec.push_back(6);
size_t c = vec.capacity(); // 일반적으로 7을 반환합니다.
vector의 최대 크기를 반환합니다.
최대 크기는 새 메모리 블록으로 할당될 때마다 컴파일러에 따라 정해진 배수 만큼 커진 크기로 설정됩니다.
empty()
vector<int> vec { 1, 2, 3, 4, 5, 6 };
bool is_empty = vec.empty(); // false를 반환합니다.
vector가 비어있는지 여부(크기가 0이면 true, 그렇지 않으면 false)를 반환합니다.
resize(count)
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.resize(4); // 컨테이너는 { 1, 2, 3, 4 } 상태임
vector의 크기를 변경합니다.
reserve(count)
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.reserve(10); // 컨테이너의 최대 크기가 10이 됩니다.
vector의 최대 크기를 변경합니다.
shrink_to_fit()
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.reserve(10); // 컨테이너의 최대 크기가 10이 됩니다.
vec.shrink_to_fit(); // 컨테이너의 최대 크기가 요소의 개수인 6이 됩니다.
vector의 최대 크기를 요소의 개수에 맞게 변경합니다.
at(index)
vector<int> vec { 1, 2, 3, 4, 5, 6 };
int v1 = vec[3]; // 4를 반환합니다.
int v2 = vec.at(3); // 마찬가지로 4를 반환합니다.
vector의 요소에 접근하여 값을 반환합니다.
범위 외의 인덱스에 접근하려고 하면 std::out_of_range 예외를 발생시킵니다.
front()
vector<int> vec { 1, 2, 3, 4, 5, 6 };
int f = vec.front(); // 1을 반환합니다.
vector에서 첫 번째 요소의 값을 반환합니다.
back()
vector<int> vec { 1, 2, 3, 4, 5, 6 };
int b = vec.back(); // 6을 반환합니다.
vector에서 마지막 요소의 값을 반환합니다.
begin()
vector<int> vec { 1, 2, 3, 4, 5, 6 };
auto it = vec.begin();
vector에서 첫 번째 요소의 iterator를 반환합니다.
end()
vector<int> vec { 1, 2, 3, 4, 5, 6 };
auto it = vec.end();
vector에서 마지막 요소의 iterator를 반환합니다.
push_back(value)
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.push_back(7); // 컨테이너는 { 1, 2, 3, 4, 5, 6, 7 } 상태임
vector의 가장 뒤에 요소를 추가합니다.
pop_back(value)
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.pop_back(); // 컨테이너는 { 1, 2, 3, 4, 5 } 상태임
vector의 마지막 요소를 제거합니다.
insert(pos, value)
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.insert(vec.begin() + 2, 0); // 인덱스 2번 자리에 0을 삽입
// 컨테이너는 { 1, 2, 0, 3, 4, 5, 6 } 상태임
vector에서 특정 위치에 값을 삽입합니다.
- pos는 값을 넣을 위치의 iterator를 나타냅니다.
erase(pos)
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.erase(vec.begin() + 2); // 인덱스 2번의 요소를 삭제합니다.
// 컨테이너는 { 1, 2, 4, 5, 6 } 상태입니다.
vector에서 특정 위치의 값을 삭제합니다.
- pos는 값을 삭제할 위치의 iterator를 나타냅니다.
erase(first, last)
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.erase(vec.begin(), vec.begin() + 2); // 컨테이너는 { 3, 4, 5, 6 } 상태입니다.
vector에서 특정 요소 범위의 값을 삭제합니다.
- first는 삭제할 범위의 첫 iterator를 나타냅니다.
- last는 삭제할 범위의 마지막 iterator를 나타냅니다.
clear()
vector<int> vec { 1, 2, 3, 4, 5, 6 };
vec.clear(); // 컨테이너는 { } 상태임
vector의 모든 요소를 삭제합니다.
swap(vector)
vector<int> vec1 { 1, 2, 3, 4, 5, 6 };
vector<int> vec2 { 11, 22, 33, 44, 55, 66 };
vec1.swap(vec2);
// vec1 컨테이너는 { 11, 22, 33, 44, 55, 66 } 상태임
// vec2 컨테이너는 { 1, 2, 3, 4, 5, 6 } 상태임
vector의 모든 요소를 교환합니다.