2012-04-06 88 views
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中是否適用於任何符合標準的編譯器?或者謂詞嚴格意味着只能在值上運行,而不是在地址上運行?

+2

只需使用一個循環。試圖讓算法適合他們不適合的地方不會對任何事情有所幫助。 – 2012-04-06 21:14:32

+0

@NicolBolas我應該從你的回答中推斷,在謂詞中使用地址肯定不符合標準? – SuperElectric 2012-04-06 21:29:28

+0

不管是不是無關緊要;所有參與者只需編寫一個循環就會更容易,更清晰。 – 2012-04-06 22:57:29

回答

1

remove_if與謂詞的使用是錯誤的,因爲remove_if通常會將未刪除的元素移動到範圍的開始位置。您需要將未刪除的元素複製到另一個容器,而不是將其刪除。