[英]std::erase in C++
我對C ++中std::erase
功能感到困惑。
以下代碼在調用std::erase
之前和之后獲得相同的輸出,但是如果在執行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 ++標准相對於類模板的列表
效果:僅使迭代器和對已刪除元素的引用無效。
因此,該程序具有未定義的行為。
在此聲明之后
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()
返回的迭代器相對應
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.