[C언어/C++] vector 정리 및 사용법

vector 컨테이너는 STL의 sequence container 중에 정말 자주 쓰게되는 컨테이너중 하나인데 자동으로 메모리가 할당되는 배열이라고 생각하면 된다.

데이터 타입은 마음대로 넣을 수 있고 대략적으로 배열의 맨 뒷쪽에 push_back()과 pop_back()으로 삽입 삭제를 하는 기능을 주로 사용하게 된다.

물론 중간의 값을 삽입하거나 삭제할 수도 있지만 배열기반이므로 삽입 삭제가 빈번하게 일어나된다면 비효율적이게 된다.

1
2
3
4
5
6
7
8
9
10
#include <vector>
using namespace std;
 
int main(void) {
 
    vector<int> v;
 
    vector<string> v;
 
}
cs

vector를 사용하기위해선 우선 #include <vector>를 통해 헤더파일을 추가해야하고 using namespace std;를 해주면 편리하다.

vector의 선언은 “vector <data type> 변수이름” 형식으로 해주면 된다.

vector의 생성자와 연산자에 대해 정리해보자면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<int> v;
// 비어있는 vector v를 생성
 
vector<int> v(10);
// 기본값(0)으로 초기화 된 10개의 원소를 가지는 vector v를 생성
 
vector<int> v(105);
// 5로 초기화된 10개의 원소를 가지는 vector v를 생성
 
vector<int> v1(105);
vector<int> v2(v1);
// v2는 v1 vector를 복사해서 생성
 
vector<int> v1;
vector<int> v2;
// 가 있고 내부에 인자들이 있다고 했을때 연산자 : “==”, “!=”, “<“, “>”, “<=”, “>=” 로 대소비교 가 가능
cs

위와 같고 vector의 멤버 함수에 대해 정리해보자면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
vector<int> v;
 
v.assign(105);
// 5의 값으로 10개의 원소 할당
 
v.at(idx);
// idx번째 원소를 참조
// v[idx] 보다 속도는 느리지만 범위를 점검하므로 안전함
 
v[idx];
// idx 번째 원소를 참조
// 범위를 점검하지 않으므로 속도가 v.at(idx)보다 빠름
 
v.front();
// 첫번째 원소를 참조
 
v.back();
// 마지막 원소를 참조
 
v.clear();
// 모든 원소를 제거
// 원소만 제거하고 메모리는 남아있음
// size만 줄어들고 capacity는 그대로 남아있음
 
v.push_back(5);
// 마지막 원소 뒤에 원소 5을 삽입
 
v.pop_back();
// 마지막 원소를 제거
 
v.begin();
// 첫번째 원소를 가리킴 (iterator와 사용)
 
v.end();
// 마지막의 “다음”을 가리킴 (iterator와 사용)
 
v.rbegin();
// reverse begin을 가리킴 (거꾸로 해서 첫번째 원소를 가리킴)
// iterator와 사용
 
v.rend();
// reverse end 을 가리킴 (거꾸로 해서 마지막의 다음을 가리킴)
// iterator와 사용
 
v.reserve(n);
// n개의 원소를 저장할 위치를 예약 (미리 동적할당)
 
v.resize(n);
// 크기를 n으로 변경
// 더 커졌을 경우 default값인 0으로 초기화
 
v.resize(n,5);
// 크기를 n으로 변경
// 더 커졌을 경우 인자의 값을 5으로 초기화
 
v.size();
// 원소의 갯수를 리턴
 
v.capacity();
// 할당된 공간의 크기를 리턴
// 공간 할당의 기준은 점점 커지면서로 capacity를 할당
 
v2.swap(v1);
// v1과 v2의 원소와 capacity 바꿔줌 (모든걸 스왑해줌)
// v1의 capacity를 없앨때 (할당한 메모리를 프로그램이 끝나기 전에 없애고 싶을때) 사용하기도 함
// v2를 capacity가 0인 임시 객체로 만들어서 스왑
// vector<int>().swap(v1);
 
v.insert(234);
// 2번째 위치에 3개의 4값을 삽입 (뒤에 값들은 뒤로 밀림)
 
v.insert(23);
// 2번째 위치에 3의 값을 삽입
// 삽입한 곳의 iterator를 반환
 
v.erase(iter);
// iter 가 가리키는 원소를 제거
// size만 줄어들고 capacity(할당된 메모리)는 그대로 남음
// erase는 파라미터 하나를 받을때와 두개를 받을 때 다름
 
v.empty()
// vector가 비었으면 리턴 true
// 비어있다의 기준은 size가 0이라는 것이지 capacity와는 상관이
cs

위와 같다.

여기서 size와 capacity를 잘 구분해야 하는데 size가 원소의 개수를 리턴해주는 것이고 capacity는 할당된 메모리의 크기를 리턴한다.

vector의 멤버 형식으론 iterator(반복자 형식), reverse_interator(역 반복자 형식), value_type(원소의 형식), size_type(원소의 개수의 형식)있다.

아래는 vector를 이용한 반복문 예시이고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<iostream>
#include<vector>
using namespace std;
 
int main(void){
    vector<int> v;
    
    v.push_back(17);
    v.push_back(24);
    v.push_back(31);
    v.push_back(38);
    v.push_back(45);
    
    
    //멤버형식 size_type 이용한 반복
    cout << “[v.at(i)] size_type : “ ;
    for(vector<int>::size_type i =0; i<v.size(); i++){
        cout << v.at(i) << ” “;
    }
    cout << endl;
    cout << “[ v[i] ] size_type : “ ;
    for(vector<int>::size_type i =0; i<v.size(); i++){
        cout << v[i] << ” “;
    }
    cout << endl << endl;
    
    
    //int i 를 이용한 반복
    cout << “[v.at(i)] int : “ ;
    for(int i =0; i<v.size() ; i++){
        cout << v.at(i) << ” “;
    }
    cout << endl;
    cout << “[ v[i] ] int : “ ;
    for(int i =0; i<v.size() ; i++){
        cout << v[i] << ” “;
    }
    cout << endl << endl;
    
    
    //반복자 iterator를 이용한 반복
    cout << “[*iter] iterator : “;
    vector<int>::iterator iter;
    for(iter = v.begin(); iter != v.end() ; iter++){
        cout << *iter << ” “;
    }
    cout << endl << endl;
    
 
    return 0;
}
cs

아래는 참조, 삽입, 삭제, size 예시이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<iostream>
#include<vector>
#include<string>
using namespace std;
 
int main(void){
    vector<string> v;
    
    v.push_back(“Let’s”);
    v.push_back(“in”);
    v.push_back(“Coder”);
    v.push_back(“Blog”);
    v.push_back(“Community”);
 
    //v.front(), v.back() 
    cout << “v.front(), v.back()” << endl;
    
    cout << “v.front() : “ << v.front() << endl;
    cout << “v.end() : “ << v.back() << endl;
    cout << endl;
    
    
    
    
    //v.popback()
    cout << “v.popback()” << endl;
    
    vector<string>::iterator iter; 
    for(iter = v.begin(); iter != v.end() ; iter++){
        cout << *iter << ” / “ ;
    }
    cout << endl;
    
    v.pop_back();
    
    for(iter = v.begin(); iter != v.end() ; iter++){
        cout << *iter << ” / “ ;
    }
    cout << endl;
    cout << endl;
 
    
        
    
    //v.erase(iter);
    cout << “//v.erase(iter)” << endl;
    
    for(iter = v.begin(); iter != v.end() ; iter++){
        if(*iter == “Coder”){
            v.erase(iter);
            break;
        }
    }
    for(iter = v.begin(); iter != v.end() ; iter++){
        cout << *iter << ” / “ ;
    }
 
    
    
    cout << endl << endl;
    //v.size(), v.capacity();
    cout << “v.size(), v.capacity()” << endl;
    
    cout << “v.size() : “ << v.size() << endl;
    cout << “v.capacity() : “ << v.capacity() << endl;
    
    return 0;
}
cs

관련글

제목 작성자 작성일