我想用矢量清除方法清除矢量中的元素。但這裏的問題是元素不能保證只在向量中出現一次。它可能會出現多次,我需要清除所有這些。我的代碼是這樣的:從矢量中清除元素
void erase(std::vector<int>& myNumbers_in, int number_in)
{
std::vector<int>::iterator iter = myNumbers_in.begin();
std::vector<int>::iterator endIter = myNumbers_in.end();
for(; iter != endIter; ++iter)
{
if(*iter == number_in)
{
myNumbers_in.erase(iter);
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> myNmbers;
for(int i = 0; i < 2; ++i)
{
myNmbers.push_back(i);
myNmbers.push_back(i);
}
erase(myNmbers, 1);
return 0;
}
此代碼顯然崩潰,因爲我改變了向量的末尾,而通過它迭代。達到此目的的最佳方法是什麼?即有沒有辦法做到這一點,而無需多次遍歷向量或創建一個向量副本?
我試過上面的一段代碼。它適用於我的初始情況,但是當我用0,0,0,1作爲值創建一個向量並試圖擦除0時,它無法正常工作。退出循環後,我發現矢量的大小是2而不是1. – Naveen 2008-12-07 10:29:57
這是最壞情況的O(N^2)。 O(N)算法存在。你可以做得更好。另外,根據STL向量<>的實現,可以刪除(iter),然後再加上++ iter,可以跳過以下條目。考慮「擦除v [i = 2]; i ++;」 - 你永遠不會檢查v []中的原始i = 3(現在是i = 2)條目。 – 2008-12-08 04:40:25