【问题标题】:Are STL predicates allowed to use their argument's address?是否允许 STL 谓词使用其参数的地址?
【发布时间】:2012-04-06 21:07:26
【问题描述】:

在编写自定义谓词函数/函子以传递给 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?或者谓词是否严格意味着只对值而不是地址进行操作?

【问题讨论】:

  • 只使用一个循环。试图让算法适合它们不适合的地方不会有任何帮助。
  • @NicolBolas 我应该从您的回答中推断出在谓词中使用地址绝对不符合标准吗?
  • 有无无关;只需编写一个循环,对所有相关人员来说都更容易、更清晰。
  • 我会说它是否更清晰与所问的问题无关;)正如您所注意到的,这是一个关于标准而不是风格的问题。

标签: c++ stl predicate remove-if


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2012-04-18
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多