簡體   English   中英

C ++中的std :: erase

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM