프로그래밍/c++

vector와 map에서의 end, 반복자의 성격.

제페 2016. 4. 2. 16:54
반응형

vector의 end는 데이터를 추가적으로 삽입한 이후(push_back) 이전 end는 무효화가 되죠?

반면 map은 end가 어느 시점에서의 end던 항상 컨테이너 요소의 끝을 의미하기에,

이 부분에 대한 명확한 스펙이 있는지 궁금했습니다.


코드로 보자면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<int> vec;
auto end0 = vec.end();
 
for(int i = 0; i != 100++i)
{
  vec.push_back(i);
}
 
auto end1 = vec.end();
 
if(end0 == end1)
{
  // 같지 않음!
}
cs


는 같지 않은 반면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
    std::map<intint> dic;
    auto end0 = dic.end();
 
    for (int i = 0; i != 100++i)
    {
      dic.insert({ i, i });
    }
 
    auto end1 = dic.end();
 
    if (end0 == end1)
    {
      // 같음!
    }
cs


map은 몇 개를 삽입한 이후에 end를 비교해도 같다는 거죠. 


이 부분이 궁금했는데 누군가 이런 글을 남겨주셨어요.


http://www.open-std.org/.../wg21/docs/papers/2014/n4296.pdf

763 page: 맨밑에 보시면, map같은 연관 컨테이너의 insert는 반복자(iterator)를 무효화하지 않고, 

다만 해당 노드가 삭제될 때 그 노드를 가리키고 있는 iterator만 무효화 된다고 나와있습니다.

참고로, end() 는 데이터의 끝이 아니라 'past-the-end' '요소의 끝을 지나친 어떤 값'으로 정의되어있습니다. 

따라서, vector같은 연속적 컨테이너의 경우에는 데이터를 추가하면 이전의 end()가 'past-the-end'가 되는 것이 불가능 하겠지요. 

그래서 당연히 저장했던 end()의 값은 무효화된 값이 되겠습니다. 


결론적으로 map과 같은 연관 컨테이너의 경우 어느 시점에서의 end던 항상 같은 end를 보장합니다.


반응형