2012-04-06 60 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通常会将未删除的元素移动到范围的开始位置。您需要将未删除的元素复制到另一个容器,而不是将其删除。