훈, IT 공부/C,C++,MFC

[C++ STL]vector 백터란

IT훈이 2018. 4. 21.
반응형


C++ STL(Standard Template Library) 에서 제일 중요한 라이브러리 두가지가 있는데 그것이 <vector> 과 <map> 이다. 

이중에 vector에 대하여서 정리를 해야할것같아서 올려본다.


vector STL(Standard Template Library)

무기로 사용되는 "Vector"

 요즘들어서 vector 벡터 하면 떠오르는 것이 "배틀그라운드" 에 등장하는 총의 종류다.  ㅎㅎ 헛소리는 여기까지 하고 넘어가자.


벡터라는 단어의 사전적인 뜻은 "크기와 방향으로 정해지는양" , "(질병의 )매개체" , "(비행기의)진로" 명시되어있다.

 

 프로그래밍적으로도 사용되고 수학적인 개념으로도 사용된다. 우리는 프로그래밍적으로 접근할 것이다. 

C++에서 사용하는 STL으로써 스택의 구조와 유사하기도 하고 단일 연결리스트와도 유사한 배열의 구조라고 할 수 있다. 배열(리스트)와는 다른점이 있기 때문에 사용하는 목적에 따라서 "vector"을 사용할 것인지 "list"를 사용할 것 인지 결정하게 된다.


vector<[자료형]> [변수이름] 

기본적으로 vector의 선언방식은 이러하다.


vector 주요 함수들


생성자

 vector v

 비어있는 vector 생성

 vector v(n)

 n개의 요소가 있는 v

 vector v(n,data)

 data로 초기화된 n개의 원소를 가지는 v 

 vector v(v2)

 v에 v2 를 복사하여 생성


v.assign(n,m) - n개의 요소에 m 값을 초기화한다.


v.at(i) - v의 i번째 요소를 참조한다.


v.front() - 첫번째 요소를 참조한다.


v.end() - 마지막 요소를 참조한다.


v.push_back(n) - 마지막 요소 다음에 n의 값을 넣는다.


v.pop_back() - 마지막 요소를 제거한다.


it = v.begin() - it는 v의 첫번째 요소를 가르는 반복자. iterator과 사용한다.


it = v.end() - it는 v의 마지막 요소를 가르키는 반복자. iterator과 사용한다.


it = v.rbegin() - it는 v의 역순차의 첫번째 요소를 가르키는 반복자.


it = v.rend() - it는 v의 역순차의 마지막 요소를 가르키는 반복자.


v.reserve(n) - n개의 원소를 저장할 공간을 예약한다.(미리 동적할당 해두는것)    추가할당 하는것이 아니다.


v.resize(n) - v의 크기를 n개만큼 변경하고 확장된 공간의 값을 default값인 0으로 초기화한다. capacity는 그대로이다.

v.resize(n,data) - v의 크기를 n개만큼 변경하고 확장된 공간의 값을 data값으로 초기화한다. capacity는 그대로이다.


v.size() -  v의 원소의 개수를 리턴한다. 


n = v.max_size() - n은 v가 담을 수 있는 최대 요소의 개수를 가진다.


n = v.capacity() - v의 요소가 할당된 공간의 크기를 리턴한다.


v.swap(v1) - v1와 v 를 서로 바꿔준다. capacity()도 바뀐다.


v.insert(p,n,x) - p가 가리키는 위치에 n개의 x값을 삽입한다.


q = v.insert(p,x) - p가 가리키는 위치에 x값을 삽입한다. q는 삽입한 원소를 가르키는 반복자.


q = v.erase(p) - p가 가리키는 원소를 제거한다 q는 다음 원소를 가르킨다. capacity는 남아있다.


v.empty() - v가 비어있는지 확인한다.


v.clear() - v의 모든요소를 제거한다. capacity는 그대로 남아있다.


v1 == v2       - v1과v2의 모든 원소가 값은가?

v1 != v2        - v1과v2의 모든 원소중 하나라도 다른것이 있는가?

v1 < v2         - 문자열처럼 비교하여 v1이 v2보다 작은가?

v1 > v2         - 문자열처럼 비교하여 v1이 v2보다 큰가?



맴버형식 

iterator - 반복자형식

reverse_iterator - 역반복자형식

value_type - 원소의 형식 int

size_type - 원소의 개수의 형식 unsigned int

1
2
3
4
    vector<int>::size_type i1;
    vector<int>::iterator i2;
    vector<int>::value_type i3;
    vector<int>::reverse_iterator i4;
cs

맴버형식의 자료형


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
    // vector<[dataType]> [변수이름]
    vector<int> v1;                // 비어있는 vector을 생성
    vector<int> v2(5);            // 기본값(0)으로 초기화된 5개의 원소를 가지는 vector
    vector<int> v3(5,2);        // 2로 초기화된 5개의 원소를가지는 vector 
    vector<int> v4(v3);            // v4는 v3 vector을 복사해서 생성한다.
 
    // Vector은 내부에 인자가 있다고 할때, 연산자 "==""!=""<"">""<=",">=" 로 비교가 가능하다.
 
    //////////////////////////////
    for(int i=0; i< 5; i++)    ////// 설명을 위해 인자를 넣어준다.
        v1.push_back(i);    //////
    //////////////////////////////
 
    // 맴버함수    v1를 기준으로 
 
    // assign 문법적으로 맡기다라는 뜻 어사인
    v3.assign(5,2);                    
 
    // 선택한 인덱스의 원소를 참조한다. 속도는 느리지만 범위를 점검하기에 안전함
    for(int i=0; i< 5; i++)
        cout << v1.at(i) << " ";    
    cout << endl;
    // 출력결과 - 0 1 2 3 4
    
    // 범위를 점검하지 않으므로 속도는 빠르다.
    for(int i=0; i< 5; i++)
        cout << v1[i] << " ";        
    cout << endl;
    // 출력결과 - 0 1 2 3 4
    
    // 첫번째요소와 마지막 요소를 참조한다.
    cout << v1.front() << endl;        
    cout << v1.back() << endl;
    // 출력결과 - 0
    // 출력결과 - 4
 
    // 마지막 원소뒤에 요소 '7'을 추가한다.
    v1.push_back(5);
 
    // 마지막 원소 뒤에 요소를 제거한다.
    v1.pop_back();
 
    // 첫번째 요소를 가리킨다.    iterator와 사용
    v1.begin();
 
    // 마지막의 다음요소를 가르킨다. iterator 와 사용
    v1.end();
 
    // reverse begin을 가르킨다. 거꾸로해서 첫번째 원소를 가리킨다.    iterator와 사용
    v1.rbegin();
 
    // reverse end을 가르킨다. 거꾸로 해서 마지막 의 다음을 기르킨다.iterator와 사용
    v1.rend();
 
    // n개의 원소를 저장할 위치를 예약한다. ( 미리 동적할당 해놉니다.)
    v1.reserve(10);
 
    // 크기를 변경한다. 더 켜졌을 경우 default값인 0으로 초기화한다.
    v1.resize(20);
 
    // 원소의 갯수를 리턴한다.
    v1.size();
 
    // 할당된 공간의 크기를 리턴한다.
    v1.capacity();                // 단어의 뜻은 용량 size와를 다르다. size는 할당된 메모리안의 요소가 들어있는개수
                                // capacity는 할당된 메모리의 갯수 크기 
    
    // 원소를 서로 바꿔준다. capacity도 바꿔준다.
    v1.swap(v3);
 
    // vector가 비어있다면 true리턴 비어있다는 기준은 size가 0이라는 뜻이다.
    v1.empty();
 
    // 요소를 정리한다. 원소만 제거하고 메모리는 남아있다.
    v1.clear();
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
#include <stdio.h>
#include <iostream>
#include <vector>    // 벡터사용을 위한 헤더파일 추가
 
using namespace std;
 
int main()
{
    vector<int> v;
 
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    v.push_back(60);
 
    for(vector<int>::size_type i = 0; i < v.size(); i++)
        cout << v[i] << endl;
    cout << endl;
 
    cout << "size:"<< v.size() << endl;
    cout << "capacity:"<<v.capacity() << endl;
    cout << "max_size:"<<v.max_size() << endl
 
    return 0;
}
cs


출력결과

10

20

30

40

50

60

size:6

capacity:6

max_size:1073741823


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    v.resize(10);
    for(vector<int>::size_type i=0; i<v.size(); i++)
        cout << v[i] << endl;
 
    cout << "size:"<< v.size() << endl;
    cout << "capacity:"<<v.capacity() << endl;
    cout << "max_size:"<<v.max_size() << endl
    cout << endl;
 
 
    v.clear();
    cout << "size:"<< v.size() << endl;
    cout << "capacity:"<<v.capacity() << endl;
    cout << "max_size:"<<v.max_size() << endl
 
cs

출력결과

10

20

30

40

50

60

0

0

0

0

size:10

capacity:10

max_size:1073741823


size:0

capacity:10

max_size:1073741823


백터를 사용해야하는 경우


1. 저장할 데이터 개수가 가변적일 경우

2. 중간에 데이터 삽입이나 삭제가 없을 경우


아직 잘 모르겠다. 실전으로 사용해본 경험이 많이 없기 때문에, 틈틈히 사용해보고 필요하다는것을 몸소 느끼고 추가로 작성해야겠다.

반응형

댓글