是否允许STL谓词使用其参数的地址?

时间:2012-04-06 21:07:27

标签: c++ stl predicate remove-if

在编写自定义谓词函数/函数以传递给STL算法时,谓词是否允许使用其参数的地址?

这是引发这个问题的问题。我有一个向量vec和一个向量inds,其中包含vec的一些索引。我想删除vecinds列出索引的那些元素。

一种方法是将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中工作?或者谓词严格意味着只对值而不是地址进行操作?

1 个答案:

答案 0 :(得分:1)

将remove_if与谓词一起使用是错误的,因为remove_if通常会将未删除的元素移到范围的开头。您需要将未删除的元素复制到另一个容器,而不是将其删除。