[effective STL] 항목 17 : 용량 바꿔치지 묘수(swap)

2015. 12. 26. 23:45프로그래밍/Effective STL

728x90
728x90

예시

100000명의 지원자를 담는 백터가 있다고 했을 때,

지원자가 줄어들때마다 백터에서 erase된다.

10명이 남게 되었을 때, 용량은 그대로 100000이다. 어떻게 해야하는가?


방법

swap을 통한 방법이다.

복사생성자를 이용하여 나오는 임시객체와 기존 객체를 스왑한다.


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
#include <iostream>
#include <vector>
#include <string>
 
void printSizeAndCapacity(const std::vector<int>& vec)
{
    std::cout<<"size = "<<vec.size()<<std::endl;
    std::cout<<"capacity = "<<vec.capacity()<<std::endl<<std::endl;
}
 
int main(int argc, const char* argv[])
{
    const int maxNumContestant = 100000;
    std::vector<int> contestant;
    contestant.reserve(maxNumContestant);
    
    printSizeAndCapacity(contestant);
 
    // add 100000 contestant
    for (int i = 0; i < maxNumContestant; i++)
    {
        contestant.push_back(i);
    }
 
    printSizeAndCapacity(contestant);
 
    // erase 99990 contestant
    contestant.erase(contestant.begin() + 10, contestant.end());
 
    printSizeAndCapacity(contestant);
 
    // swap skill
    std::vector<int>(contestant).swap(contestant);
 
    printSizeAndCapacity(contestant);
 
    return 0;
}


std::vector<int>(contestant)는 constestant로 복사생성자를 호출하여 임시객체를 반환하는데

이 임시 객체는 contestant의 사이즈만큼 복사 생성하고 이것을 기존의 constestant를 교환한다.

이는 STL에 구현한 개발자에 따라 용량 설정이 다르기 때문에 일정 바이트 이상으론 줄어들지 않을 수 있다.

728x90
반응형