에 삭제 (반복자를) 일에 관찰 간단한 std::vector다른 동작 벡터와지도
std::vector<int> integers;
integers.push_back(10);
integers.push_back(11);
cout << "Before: " << integers.size(); //prints 2
I 각 요소 하나의 C++ 5.1 및 C++ (14)을 삭제하는 코드의 3 가지 버전을 사용하여 시도
버전 1 :
for(std::vector<int>::iterator it = integers.begin() ; it != integers.end() ;)
{
cout << "\nVal: " << *it;
it = integers.erase(it);
}
cout << "\nAfter: " << integers.size();
출력 [Expected]
,745 CBefore: 2
Val: 10
Val: 11
After: 0
버전 2 :
for(std::vector<int>::iterator it1, it = integers.begin() ; it != integers.end() ;)
{
cout << "\nVal: " << *it;
it1 = std::next(it);
integers.erase(it);
it = it1;
}
출력 : [예기치 않은]
Before: 2
Val: 10
After: 1
동안 std::map를 들어, 버전 2 일 예상대로 :
int main() {
std::map<int, int> m;
m.insert(make_pair(10, 11));
m.insert(make_pair(12, 13));
cout << "Before: " << m.size();
for(std::map<int, int>::iterator it1, it = m.begin() ; it != m.end() ;)
{
cout << "\nVal: " << it->first << ", " << it->second;
it1 = std::next(it);
m.erase(it);
it = it1;
}
cout << "\nAfter: " << m.size();
return 0;
}
출력 :
Before: 2
Val: 10, 11
Val: 12, 13
After: 0
심지어이 작품 :
for(std::map<int, int>::iterator it1, it = m.begin() ; it != m.end() ;)
{
cout << "\nVal: " << it->first << ", " << it->second;
m.erase(it++);
}
왜 버전의 표준 : :지도가 아닌 표준 : : 벡터에 2 개 작품?
'map <> :: erase (it)'와'vector <> :: erase (it) '는 결과 반복자에서 동일한 동작을 나타내야한다는 표준이 있습니까? 제가 알고있는 유일한 것은 첫 번째 버전이 일반적인 방법으로 작동한다는 것입니다. –
'map :: erase'는 버전 1을 지원하지 않습니다. 그렇습니다. 그렇다고 표준화되어 있지는 않지만 개발자의 관점에서 볼 때'version 2'를'vector'와 함께 사용하는 중에 실수로 쉽게 실수 할 수 있습니다. –
방금'it = m.erase (it); '를 사용하고'it1'을 사용하지 않고'After : 0'을 받았습니다. –