본문 바로가기

C++

C++ STL(Vector)

Vector란?

배열기반의 컨테이너로 메모리가 자동으로 heap에 할당되는 배열이다.

 

Vector의 특징

vector는 배열 기반으로 이뤄져 있기 때문에 삽입 삭제가 배열의 맨 뒤에서만 이루어진다.
중간부터의 삭제도 가능하지만 중간의 삽입 삭제 경우에는 삽이 한 위치에서부터 모든 배열을 뒤로 미루거나
삭제 시에는 모든 배열을 앞으로 당겨줘야 하는 문제가 존재하여 성능상 비효율적이다.
할당 메모리 이상의 데이터 값을 넣을 때는 복사 할당이 이루어진다.
메모리가 이상의 값이 들어올 경우에는 현재의 메모리의 1.5배 크기의 메모리를 동적할당하여 해당 동적할당 값에
값을 복사하게 된다.

 

vector의 선언과 삽입 삭제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void main()
{
    vector<int> vecint;
    vecint.push_back(10);
    vecint.push_back(20);
    vecint.push_back(30);
    vecint.push_back(40);
 
    for (int i = 0; i < 4++i)
        cout << vecint[i] << endl;
 
    vecint.pop_back();
    vecint.pop_back();
    vecint.pop_back();
    
    for (int i = 0; i < 1++i)
        cout << vecint[i] << endl;
}
cs

3행 : vector의 선언 vector를 int형으로 만들었다.
4~7행 : vector의 삽입 마지막에 값을 넣겠다는 뜻이다.
12~14행 : vector의 삭제 마지막에 값을 삭제한다 반환값은 void이다. 단순 값 삭제만 일어난다.
10,17행 : vector도 배열이기 때문에 index 접근이 가능하다.

 

vector의 크기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main()
{
    vector<int> vecint;
    vecint.push_back(10);
    vecint.push_back(20);
    vecint.push_back(30);
    vecint.push_back(40);
 
    for (int i = 0; i < vecint.size(); ++i)
        cout << vecint[i] << endl;
 
    vecint.pop_back();
    vecint.pop_back();
    vecint.pop_back();
    
    for (int i = 0; i < vecint.size(); ++i)
        cout << vecint[i] << endl;
 
    cout << "vecint의 사이즈 : " << vecint.size() << endl;
    cout << "vecint의 메모리 공간 : " << vecint.capacity() << endl;
}
cs

9,16행 : size()는 vector의 현재 가지고있는 값의 갯수를 반환해준다.

20행 : capacity()는 vector의 메모리 공간을 반환해준다.

 

size는 vector의 값이줄어들면 같이 줄어들지만 capacity 메모리 공간은 값이 줄어도 줄어들지 않는다.

그렇기 때문에 해당 예제에서 size는 1이지만 capacity는 4가 출력된다.

 

vector의 메모리 공간 초기화

위에 예제에서 vector의 메모리 공간은 할당해둔 메모리의 공간을 게속 유지한다고했다.

하지만 메모리 공간을 초기화 하는 함수는 존재하지 않는다. 그럴때 사용하는게 swap이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main()
{
    vector<int> vecint;
    vecint.push_back(10);
    vecint.push_back(20);
    vecint.push_back(30);
    vecint.push_back(40);
 
    vecint.pop_back();
    vecint.pop_back();
    vecint.pop_back();
 
    cout << "vecint의 사이즈 : " << vecint.size() << endl;
    cout << "vecint의 메모리 공간 : " << vecint.capacity() << endl;
 
    vecint.swap(vector<int>());
 
    cout << "vecint의 사이즈 : " << vecint.size() << endl;
    cout << "vecint의 메모리 공간 : " << vecint.capacity() << endl;
}
 
cs

13,14행 : size는 1 capacity는 4가 출력된다.

16행 : swap()은 자기 자신과 매개변수의 값을 바꾸어주는 함수이다.
해당 함수를 실행하게 되면 자기 자신과 매개변수로 들어온 vector의 swap이 일어나게 되는데 이때 중요한 것을
매개변수가 임시 객체이기 때문에 함수가 종료되면 사라진다는 것이다. 그렇기 때문에 vecint가 임시 객체랑 swap되어
함수가 끝나면서 자기 자신의 메모리 공간을 반환하게 된다.

18,19행 : size는 0 capacity는 0이 출력된다.

 

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
void main()
{
    vector<int> vecint;
   vecint.reserve(10); // 10개의 빈공간을 잡아준다.
    if (vecint.empty())
    {
        //empty() : 해당 vector가 비어있는지 확인
        //비어있다면 true 값이 존재한다면 false를반환
    }
 
    vecint.push_back(10);
    vecint.push_back(20);
    vecint.push_back(30);
 
    cout << vecint.at(0<< endl;
    // at(int) : int번째 원소를 참조 범위를 점검해준다.
 
    cout << vecint.front() << endl;
    cout << vecint.back() << endl;
    // front() : 첫번째 원소 참조
    // back() : 마지막 원소 참조
    
    vecint.begin();
    vecint.end();
    // begin() : 첫번째 원소의 반복자를 가리킨다.
    // end() : 마지막 원소의다음을 반복자를 가리킨다.
 
    vecint.rbegin();
    vecint.rend();
    // rbegin() : 마지막 원소를 가리킨다.
    // rend() : 첫번째 원소의다음을를 가리킨다.
 
    vecint.insert(vecint.begin()+140);
    // insert(위치, 
 
    vecint.clear();
    // clear() : 모든 원소제거 메모리 공간은 남아있는다.
}
cs

'C++' 카테고리의 다른 글

C++ STL(알고리즘)  (0) 2020.09.28
C++ STL(반복자 iterator)  (0) 2020.09.28
C++ 템플릿(template)  (0) 2020.09.24
C++ 함수객체  (0) 2020.09.23
C++ 상속  (0) 2020.09.17