gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:21:20 25 4
gpt4 key购买 nike

一个简单的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.

关于c++ - 在 vector 和 map 上执行 erase(iterator) 时观察到的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41436045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com