2011-10-09 58 views
1
vector<unsigned int> x; 
vector<unsigned int>::iterator itr; 
unsigned int varF; 
... 
.... 

// find and delete an element from a vector. 
itr = std::find(x.begin(), x.end(), varF); // <algorithm> 
if (itr != x.end()) 
x.erase(itr); 
//or 
x.erase(std::remove(x.begin(), x.end(), varF), x.end()); 

我想這個向量轉換爲指針從指針向量中查找和刪除元素?

vector<unsigned int*> x; 

我如何轉換上述功能的指針的向量的載體?

+1

爲什麼你認爲你需要指針? –

+1

它應該看起來完全一樣。你究竟發生了什麼問題?唯一的通知是,也許你需要在將矢量從矢量中移除之前/之後釋放指針。 –

回答

8

使用find_if代替find,或remove_if代替remove,採用自定義的斷言:

struct FindIntFromPointer 
{ 
    FindIntFromPointer(int i) : n(i) { } 
    bool operator()(int * p) const { return n == *p; } 
private: 
    int n; 
}; 

std::find_if(x.begin(), x.end(), FindIntFromPointer(varF)); 
x.erase(std::remove_if(x.begin(), x.end(), FindIntFromPointer(varF)), x.end()); 

如果你有C++ 11,你可以使用lambda而非明確斷言:

std::find_if(x.begin(), x.end(), [varF](int * p) -> bool { return varF == *p; }); 

如果您想要將其用於需要取消引用和比較的其他類似情況,則可將謂詞轉換爲模板。如果是這樣的話,模板比每次輸入lambda表達更優雅。

+0

你在'operator'之後缺少'()'。 –

+0

@ K-ballo:謝謝,修正! –

+0

@kerrek SB:謝謝你的幫助。 – DataMiner