2017-05-27 64 views
-1

我對C++中的std::erase函數感到困惑。標準:: C++中的擦除

以下代碼在調用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 
+3

返回的迭代器有什麼實際上不清楚從[文檔] (http://en.cppreference.com/w/cpp/container/list/erase)?除此之外,你的輸出不會像你描述的那樣渲染。 –

+4

此外,[不包括''](http://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h)。 –

+2

標準庫中沒有'std :: erase'。 – juanchopanza

回答

9

erase無效,你給它(加上可能其他的,這取決於容器)的迭代器。
之後使用和取消引用此迭代器是未定義的行爲。

2

按照C++相對於類模板列表

影響的標準:只有失效的迭代器和引用到擦除 元素。

因此該程序具有未定義的行爲。

這種說法

v.erase(it); 

,最初被定爲

it = v.begin(); 

現在不符合v.begin()迭代it和迴路的輸出

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

確認後。

而不是

v.erase(it); 

你可以寫

it = v.erase(it); 

,並在這種情況下,返回的迭代確實會對應於v.begin()