C/C++에서의 배열은 한 번 선언해주면 크기를 바꿀 수 없습니다. 그래서 C언어에서는 malloc 함수를 통해서 가변 배열을 만들어줘야 했습니다.(비슷하게 C++도 new 연산자를 사용해 동적 할당으로 가변 배열을 만들 수는 있습니다.)
하지만, C++에서는 편리하게 클래스에서 가변 배열을 지원해줍니다. 그것이 vector 입니다. 이 vector에 대해서 알아보겠습니다.
#include <vector>
vector는 vector헤더파일을 선언해야 사용할 수 있습니다.
#include <vector>
template < class T, class Alloc = allocator<T> > class vector;
선언 방법
vector<int> v1; // int형의 빈 벡터
vector<int> v2(3); // 크기를 3, 초기 값으로 0을 설정한 벡터
vector<int> v3(4, 1); // 크기를 4, 초기 값으로 1을 설정한 벡터
vector<int> v4 = { };
vector<int> v5 = { 1, 2, 3 }; // 1, 2, 3을 원소로 가진 벡터
vector<vector<int>> v6; // 2차원 벡터
vector<int> v7[] = {{ 1 }, { 2 }}; // 열의 크기가 2로 고정된 벡터
멤버 함수 목록
1. Iterators(반복자)
begin() : 벡터의 시작 지점의 주소 값을 반환합니다.
end() : 벡터의 끝 부분 + 1의 주소 값을 반환합니다.
rbegin(), rend() : 벡터의 끝에서 시작하는 반복자입니다. begin과 end의 역순입니다.
cbegin(), cend(), crbegin(), crend() : 각각의 반복자를 const_iterators로 받아옵니다.
예시
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = { 1, 2, 3, 4, 5 };
vector<int>::iterator itor;
for (itor = v.begin(); itor != v.end(); itor++) {
cout << *itor << endl; // 출력 : 1, 2, 3, 4, 5
}
for (itor = v.rbegin(); itor != v.rend(); itor++) {
cout << *itor << endl; // 출력 : 5, 4, 3, 2, 1
}
return 0;
}
2. Capacity(용량)
size() : 벡터의 크기를 반환합니다.
max_size() : 벡터의 최대 크기를 반환합니다.
capacity() : 벡터의 할당된 크기를 반환합니다.
resize(n) : 벡터의 크기를 변경합니다. 만약 현재 크기보다 커지면 0으로 초기화하고, 작아지면 뒤의 부분을 자릅니다.
resize(n, val) : 크기를 변경할 때 초과하는 부분을 val로 초기화합니다.
empty() : 벡터가 비었는지 체크합니다.
reserve(n) : 벡터를 n만큼 할당합니다.
shrink_to_fit() : 벡터의 용량을 크기에 맞게 줄여줍니다.
size와 capacity의 차이점은, size는 벡터에 요소가 들어간 수이고 capacity는 벡터가 메모리에 할당된 크기를 뜻합니다. 둘은 같을 수도 있고 다를 수도 있습니다. 벡터에서는 요소가 추가될 때 마다 벡터의 크기를 늘리는 것은 비효율적이기 때문에, 미리 일정 크기를 선언해놓는 것도 좋습니다. 때문에 capacity는 항상 size보다 크거나 같아야 합니다.
예시
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = { 1, 2, 3, 4, 5 };
cout << v.size() << endl; // 출력 : 5
v.reserve(10);
cout << v.capacity() << endl; // 출력 : 10
v.resize(7, 2); // 1, 2, 3, 4, 5, 2, 2
v.shrink_to_fit();
cout << v.capacity() // 출력 : 7
return 0;
}
3. Element access(요소 접근)
operator[] : 배열에서 요소에 접근하기 위해 []를 사용했던 것과 동일합니다.
at(i) : []와 같으나, 인덱스 범위를 벗어난다면 out_of_range 예외를 발생시킵니다.
front() : 벡터의 첫 번째 요소를 참조합니다.
back() : 벡터의 마지막 요소를 참조합니다.
data() : 벡터의 첫 번째 요소에 대한 포인터를 반환합니다.
예시
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = { 1, 2, 3, 4, 5 };
int* p = v.data();
cout << *p << endl; // 출력 : 1
p++;
p++;
cout << *p << endl; // 출력 : 3
for (int i = 0; i < v.size(); i++) {
cout << v[i] << endl; // 출력 : 1, 2, 3, 4, 5
}
for (int i = 0; i < v.size(); i++) {
cout << v.at(i) << endl; // 출력 : 1, 2, 3, 4, 5
}
cout << v.front() << endl; // 출력 : 1
cout << v.back() << endl; // 출력 : 5
return 0;
}
4. Modifiers(수정자)
assign : 벡터를 새로 할당합니다.
1. assign(InputIterator first, InputIterator last) : first와 last 사이의 범위에 있는 요소로 벡터를 새로 만들어냅니다.
2. assign(size_type n, const value_type& val) : val을 n개 복사합니다.
3. assign(initializer_list<value_type> il) : 벡터를 il의 요소들로 복사합니다.
push_back() : 벡터의 마지막 부분에 요소를 추가합니다.
pop_back() : 벡터의 마지막 요소를 삭제합니다.
insert : 벡터에 요소를 삽입합니다. 요소들 사이에 삽입한다면 요소들이 한 칸씩 밀려납니다. 크기와 용량은 자동으로 적절하게 변합니다.
1. insert(const_iterator position, const value_type& val) : position에 val를 삽입합니다.
2. insert(const_iterator position, size_type n, const value_type& val) : position에 val를 n번 삽입합니다.
3. insert(const_iterator position, InputIterator first, InputIterator last) : position에 first와 last사이의 요소를 삽입합니다.
4. insert(const_iterator position, initializer_list<value_type> il) : position에 il의 요소들을 삽입합니다.
erase : 벡터에서 요소를 지웁니다.
1. erase(const_iterator position) : 해당 위치의 요소를 지웁니다.
2. erase(const_iterator first, const_iterator last) : first와 last사이의 요소를 지웁니다.
swap(vector& x) : 벡터 x와 요소를 서로 바꿉니다.
clear() : 벡터의 모든 요소를 지웁니다.
emplace(const_iterator position, Args&&... args) : position에 요소를 삽입합니다.
emplace_back() : 벡터의 마지막 부분에 요소를 추가합니다.
예시
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = { 1, 2, 3, 4, 5 };
v.assign(v.begin(), v.begin() + 3); // v = { 1, 2, 3 }
v.assign(5, 3); // v = { 3, 3, 3, 3, 3 }
auto il = { 1, 2, 3, 4, 5 };
v.assign(il); // v = { 1, 2, 3, 4, 5 }
v.push_back(6); // v = { 1, 2, 3, 4, 5, 6 }
v.pop_back(); // v = { 1, 2, 3, 4, 5 }
v.insert(v.begin(), 0); // v = { 0, 1, 2, 3, 4, 5 }
v.insert(v.begin() + 2, 2, 10); // v = { 0, 1, 10, 10, 2, 3, 4, 5 }
int v2 = { 11, 12 };
v.insert(v.begin() + 4, v2, v2 + 3); // v = { 0, 1, 10, 10, 11, 12, 2, 3, 4, 5 }
v.erase(v.begin() + 2); // v = { 0, 1, 10, 11, 12, 2, 3, 4, 5 }
v.erase(v.begin() + 2, v.end() - 4 // v = { 0, 1, 2, 3, 4, 5 }
return 0;
}
Reference
https://www.cplusplus.com/reference/vector/vector/
'C++ > STL' 카테고리의 다른 글
[C++/STL] map, unordered_map (0) | 2022.04.21 |
---|---|
[C++/STL] deque (덱) (0) | 2022.04.12 |
[C++/STL] priority_queue (우선순위 큐) (1) | 2022.04.05 |
[C++/STL] queue (큐) (0) | 2022.04.01 |
[C++/STL] stack (스택) (0) | 2022.03.31 |