在 vector 和 map 上执行 erase(iterator) 时观察到的不同行为

Different behavior observed upon doing erase(iterator) on vector and map

一个简单的std::vector

std::vector<int> integers;
integers.push_back(10);
integers.push_back(11);    
cout  << "Before: " << integers.size();  //prints 2

我尝试使用 3 个不同版本的代码逐一擦除每个元素 C++5.1 和 C++14

版本 1:

for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; )
{
  cout << "\nVal: " << *it;
  it = integers.erase(it); 
}

cout << "\nAfter: " << integers.size(); 

输出:[Expected]

Before: 2
Val: 10
Val: 11
After: 0

C++14 中的版本 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 适用于 std::map 但不适用于 std::vector?

不同之处在于std::vector迭代器在擦除元素后失效,而对于关联容器(23.2.4关联容器)

9 The insert and emplace members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.