본문 바로가기

C++/STL

[C++/STL] vector (벡터)

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