一老大說
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
等等 非隨機型別的迭代器是不能使用的。我覺得第一種寫法更漂亮通用。至於**的正確性,我測試過,工作得很好。
我猜想作者這裡應該沒有完整描述真實的工作環境,應該還有一些限制條件沒有列出來,我
了一下,發現了下面的情況:
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...