Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL谓词是否允许使用其参数';谁的地址?_C++_Stl_Predicate_Remove If - Fatal编程技术网

C++ STL谓词是否允许使用其参数';谁的地址?

C++ STL谓词是否允许使用其参数';谁的地址?,c++,stl,predicate,remove-if,C++,Stl,Predicate,Remove If,编写自定义谓词函数/函子以传递给STL算法时,是否允许谓词使用其参数的地址 这个问题激发了这个问题。我有一个vectorvec,还有一个vectorinds,其中包含一些进入vec的索引。我想删除vec中索引列在inds中的那些元素 一种方法是将remove_if与谓词函子InInds一起使用,该函子通过获取其地址来确定其参数在vec中的索引: class InInds { private: const vector<Element>& vec_; const

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

这个问题激发了这个问题。我有一个vector
vec
,还有一个vector
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();
  }

}
类索引{
私人:
常数向量&vec;
常数向量&inds;
公众:
InInds(常数向量和向量,常数向量和inds)
:vec_(vec),inds_(inds){
布尔运算符()(常量元素和元素){
//警告:使用元素的地址,而不是其值。可能不是犹太教徒?
int index=&element-&vec[0];
返回std::find(inds_.begin(),inds_.end(),index)!=inds_.end();
}
}
如果直接在
vec
中的元素上调用,
InInds
可以工作。如果在元素的副本上调用它,它将中断,因为副本的地址对于确定
元素的索引没有用处


我的问题是:对于任何符合标准的编译器,这个谓词在
remove\u中是否有效?或者谓词严格意义上是只对值而不是对地址进行操作吗?

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

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