2
當編寫自定義謂詞函數/函子傳遞給STL算法時,是否允許使用謂詞的謂詞地址?STL謂詞是否允許使用它們的參數地址?
這是激發問題的問題。我有一個矢量vec
和一個矢量inds
,其中包含一些索引到vec
。我想刪除vec
其中的索引列於inds
中的元素。
一種方法是使用remove_if
與謂詞函子InInds
,通過採取其地址來確定其參數在vec
指數:
class InInds {
private:
const vector<Element>& vec_;
const vector<int>& inds_;
public:
InInds(const vector<Element>& vec, const vector<int>& inds)
: vec_(vec), inds_(inds) {}
bool operator()(const Element& element) {
// WARNING: uses the ADDRESS of element, not its value. May not be kosher?
int index = &element - &vec[0];
return std::find(inds_.begin(), inds_.end(), index) != inds_.end();
}
}
InInds
作品如果vec
直接調用一個元素。如果在元素的副本上調用它,它將會中斷,因爲該副本的地址對確定element
的索引無用。
我的問題是:這個謂詞在remove_if
中是否適用於任何符合標準的編譯器?或者謂詞嚴格意味着只能在值上運行,而不是在地址上運行?
只需使用一個循環。試圖讓算法適合他們不適合的地方不會對任何事情有所幫助。 – 2012-04-06 21:14:32
@NicolBolas我應該從你的回答中推斷,在謂詞中使用地址肯定不符合標準? – SuperElectric 2012-04-06 21:29:28
不管是不是無關緊要;所有參與者只需編寫一個循環就會更容易,更清晰。 – 2012-04-06 22:57:29