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()
返回的迭代器
我对 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()