STL vector的erase操作問題

2021-05-22 21:14:59 字數 2660 閱讀 2956

一老大說

csdn

上有篇博文(

「關於stl vector

的erase

)黑奇怪,抱著獵奇的心態,偶也去湊哈熱鬧,發現了一點問題,報告給大家。

作者說下面的**是錯誤的:

vectorshort > m_uintvector;

m_uintvector.push_back(10);

m_uintvector.push_back(20);

m_uintvector.push_back(30);

vectorshort >::iterator itr;

itr = std::find(m_uintvector.begin(), m_uintvector.end(), 20);

m_uintvector.erase( itr);

作者給出了「正確」的**:

vectorshort > m_uintvector;

m_uintvector.push_back(10);

m_uintvector.push_back(20);

m_uintvector.push_back(30);

vectorshort >::iterator itr;

itr = std::find(m_uintvector.begin(), m_uintvector.end(), 20); //

刪除元素

int diff = itr - m_uintvector.begin();

m_uintvector.erase(  m_uintvector.begin() + diff );

我倒沒看到「正確」的**高明在**?姑且不考慮**是否正確,從**量來看,明顯增加了;從**的 通用性來看,

iterator + diff

這樣的**只適用隨機迭代器,對

list, map

等等 非隨機型別的迭代器是不能使用的。我覺得第一種寫法更漂亮通用。至於**的正確性,我測試過,工作得很好。

我猜想作者這裡應該沒有完整描述真實的工作環境,應該還有一些限制條件沒有列出來,我

google

了一下,發現了下面的情況:

void

main()

} for (iter = member.begin();

iter != member.end();iter++)

cout<<*iter< }

乍一看,這不是和上面提到的第一種方法一樣嗎?貌似沒有問題啊。可是,要注意到,呼叫

erase

後,回到

for迴圈又繼續使用迭代器,並執行

++運算。

好,讓我們再溫習一下

erase

函式的說明:

iterator erase ( iterator position );

iterator erase ( iterator first, iterator last );

現在我們只關注函式執行後的***和返回值。函式呼叫後使指向

position

和first

之後的所有迭代器失效。返回值則是 乙個指向刪除的最後乙個元素後面的元素的迭代器。所以上面**中的

iter

在呼叫erase

後就無效了,我在

vs2005

中測試了,確實崩潰在

++的操作上。

要解決這個問題,我們只需棄用原來的迭代器,使用返回值即可,**如下:

for(iter = member.begin(); iter != member.end();)

else

} 網路上還有很多這樣的文章都沒太講清楚,比如「

如何刪除

std::vector

內 的element?

一文中說:若要刪除

std::vector

中的element

,正規的方式該用

find() generic algorithm

,若find()

找到了,會傳回該

iterator

,若找不到,將傳回

vector.end()

。這種寫法遠比用

for loop

乾淨很多。

看他給出的**:

// compile ok, but run-time error!!

// for(std::vector::iterator iter = ivec.begin();

//  iter != ivec.end(); ++iter)

// }

// this is a right way to do it.

std::vector::iterator iter = find(ivec.begin(), ivec.end(), 8);

if (iter != ivec.end())

所以,網路上的文章看看就是了,最好是當作**來看,獵奇一下別人的 技術人生,至於是否真實是否正確,不要當真了,否則下一代堂吉訶德就要誕生了,呵呵。

STLvector的記憶體問題

讀 資料結構預算法分析c 描述 人民郵電p54問題?vector類內部儲存查得資料 轉侵刪。用於自己學習 在stl的容器中,vector可以說是最容易理解和使用的容器了,以前使用陣列的時候,如果不確定有多少資料要儲存,就會預先分配乙個大的陣列,如果實際沒有用到那麼多,又會浪費很多的記憶體資源,如果不...

STL vector 的使用方式

向量容器不但能像陣列一樣對元素進行隨機訪問,還能在尾部插入元素,是一種簡單 高效的容器,完全可以代替陣列。同樣 下標從0開始 1.標頭檔案 vector 2.宣告 vector type v 可以事先確定乙個長度 不夠再擴充套件 甚至,先全賦值 例 vector double v 10,2.555 ...

STL vector 的使用演算法

includeusing namespace std include 向量 include 迭代器 include 演算法 include 函式 stl三大元件 容器,演算法,迭代器 void main vectora ar,ar 8 a.push back 1 a.push back 2 copy...