##沒有躲過的坑--vector使用erase后迭代器變成野指針
vector上鏡率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。
**erase–return value**?
首先需要明確一下vector的兩種erase:
C++98中是這樣的:
~~~
iterator erase (iterator position);
iterator erase (iterator first, iterator last)
~~~
C++11是這樣的:
~~~
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
~~~
我們使用下面的代碼進行erase:
~~~
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
// set some values (from 1 to 10)
for (int i=1; i<=10; i++) myvector.push_back(i);
// erase the 6th element
myvector.erase (myvector.begin()+5);
// erase the first 3 elements:
myvector.erase (myvector.begin(),myvector.begin()+3);
std::cout << "myvector contains:";
for (unsigned i=0; i<myvector.size(); ++i)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
/*--------------------------------------
Output:
myvector contains: 4 5 7 8 9 10
---------------------------------------*/
~~~
上面的代碼非常的完美,但是當把ease用于for循環的時候,就完蛋了:
~~~
for(vector<int>::iterator iter=vector_database.begin(); vector_database!=veci.end(); iter++)
{
if( *iter == 10)
{
vector_database.erase(iter);
}
}
~~~
當執行veci.erase(iter)后,迭代器iter指向了哪里?
是時候關注一下erase方法的返回值了:
An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.
Member type iterator is a?**random**?access iterator type that points to elements.
看到random你就要瘋掉了吧,野指針!!!!
也就是說veci.erase(iter)后,iter的狀態是不確定的,再進行++,豈有不崩潰的道理!!
解決方法一,就是ease后對iter進行重新賦值。?
解決方法二:再 使用一個迭代器。
~~~
vector<int>::iterator itor2;
for(vector<int>::iterator iter=vector_database.begin(); iter!=vector_database.end(); )
{
if( *iter == 10)
{
itor2=iter;
vector_database.erase(itor2);
}
else
iter ++ ;
}
~~~
**remove or erase?**?
很多人還用到過remove,但是對于很多人不能分清楚remove和erase的區別?
STL中remove()只是將待刪除元素之后的元素移動到vector的前端,而不是刪除。若要真正移除,需要搭配使用erase()。
vector中的remove的作用是將等于value的元素放到vector的尾部,但并不減少vector的size
vector中erase的作用是刪除掉某個位置position或一段區域(begin, end)中的元素,減少其size
**erase with remove_if**
~~~
vector_database.erase(
std::remove_if(vector_database.begin(),
vector_database.end(),
[this](const unique_ptr<lesschat::Channel>& vector_database) {
return this->current_channel_id_ == vector_database->channel_id();
}));
~~~
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常