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

Are STL predicates allowed to use their argument's address?

本文关键字:参数 地址 STL 谓词 是否      更新时间:2023-10-16

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

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

一种方法是将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();
  }
}

如果直接在 vec 中的元素上调用,InInds 工作。如果在元素的副本上调用它,它将中断,因为副本的地址对于确定element的索引没有用。

我的问题是:这个谓词是否适用于任何符合标准的编译器remove_if?还是谓词严格来说只对值起作用,而不是对地址起作用?

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