std::erase 在 C++ 中

std::erase in C++

我对 C++ 中 std::erase 的功能感到困惑。

下面的代码在 std::erase 之前和之后得到相同的输出是 called.But 如果在执行 std::erase 之后遍历列表然后在输出中不显示擦除的值。 帮助我理解 std::erase.

#include<bits/stdc++.h>
using namespace std;

int main()
{
    list<int> v;
    v.push_back(12);
    v.push_back(10);
    v.push_back(20);

    list<int>::iterator it;
    it = v.begin();
    printf("%u %d\n", it, *it);
    v.erase(it);
    printf("%u %d\n", it, *it);

    for(it= v.begin(); it!= v.end(); it++)
        cout<< *it<<" ";
    return 0;
}

输出:

"Memory address" 12  
"Memory Address" 12  
10 20

erase 使您给它的迭代器无效(可能还有其他迭代器,具体取决于容器)。
之后使用和取消引用此迭代器是未定义的行为。

根据 C++ 标准相对于 class 模板列表

Effects: Invalidates only the iterators and references to the erased elements.

因此程序有未定义的行为。

这条语句之后

v.erase(it);

初始设置为

的迭代器it
it = v.begin();

现在不对应v.begin()和循环的输出

for(it= v.begin(); it!= v.end(); it++)
    ^^^^^^^^^^^^^         
    cout<< *it<<" ";

确认。

而不是

v.erase(it);

你可以写

it = v.erase(it);

并且在这种情况下,返回的迭代器确实对应于 v.begin()

返回的迭代器