-
vector와 map에서의 end, 반복자의 성격.프로그래밍/c++ 2016. 4. 2. 16:54반응형
vector의 end는 데이터를 추가적으로 삽입한 이후(push_back) 이전 end는 무효화가 되죠?
반면 map은 end가 어느 시점에서의 end던 항상 컨테이너 요소의 끝을 의미하기에,
이 부분에 대한 명확한 스펙이 있는지 궁금했습니다.
코드로 보자면,
1234567891011121314vector<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 는 같지 않은 반면,
1234567891011121314std::map<int, int> 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를 보장합니다.
반응형'프로그래밍 > c++' 카테고리의 다른 글
iostream cerr, clog의 사용 (0) 2016.04.05 c++] 시스템의 환경 변수 얻기 std::getenv (0) 2016.04.04 boost::pool_allocator와 boost::fast_pool_allocator의 차이 (0) 2016.02.28 boost/pool을 멀티 스레드 환경에서 제대로 활용하려면.. (0) 2016.02.28 std::put_time (0) 2016.02.01