【发布时间】:2018-12-12 01:54:41
【问题描述】:
我正在尝试擦除刚刚遍历到的元素。我最初忘记将 s1.erase(...就像它最初打算工作的方式一样。 看起来 std::erase 推进了迭代器并将值存储在 rit 中。我找不到任何解释此行为的文档。
https://en.cppreference.com/w/cpp/container/set/erase 表示必须存储返回的迭代器。 set::erase 的所有参数都是按值传递的,那么反向迭代器是如何推进的呢?
这个循环是如何完成的?
std::set<int> s1;
s1.insert(20);
s1.insert(30);
s1.insert(50);
auto rit = s1.rbegin();
for (; rit!= s1.rend();)
{
std::cout << "rit is " << *rit << " size is " << s1.size() << std::endl;
s1.erase(std::next(rit).base());
std::cout << "rit after erase is " << *rit << std::endl;
}
输出是
rit 是 50 大小是 3
擦除后的 rit 为 30
rit 是 30 大小是 2
擦除后的 rit 为 20
rit 是 20 大小是 1
分段错误
【问题讨论】: