C and C++

[C++][STL] size()함수 주의사항

개발새발 2020. 1. 29. 20:40
반응형

STL size()함수 주의사항

STL에서 제공하는 size()함수의 리턴타입을 찾아보면 아래와 같이 부호가 없는 정수형으로 나와있다.

 

std::size_t is commonly used for array indexing and loop counting. Programs that use other types, such as unsigned int

 

따라서 size()함수를 통해 아래와 같은 코드를 작성하면 문제가 된다.

 

for (int i=0; i < vt.size() - 1 ; i++)

     doSomething();

 

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
#include<vector>
#include<iostream>
using namespace std;
 
 
int main(void) {
    vector<int> vt;
 
    for (vector<int>::size_type i = 0; i < 10; i++)
        vt.push_back(i);
 
    cout << vt.size() << endl;
 
    for (vector<int>::size_type i = 0; i < 10; i++)
        vt.pop_back();
 
    cout << vt.size() - 1 << endl;
 
    return 0;
}
cs

위 코드를 실행해보면 

10
4294967295

 

vt.size()-1의 값이 예상치 못한 4294967295로 나왔다.

이는 size()함수의 리턴값의 타입이 부호가 없는 정수형이기 때문에 오버플로우가 발생한 경우이다.

따라서 vt.size()를 사용하기 전에 empty()체크를 하는 로직을 넣거나 하는 등의 로직을 추가해야한다.

 

 

반응형