是否允许 STL 谓词使用其参数的地址?
Are STL predicates allowed to use their argument's address?
编写自定义谓词函数/函子以传递给 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通常会将未删除的元素移动到范围的开头。您需要将未删除的元素复制到另一个容器,而不是就地删除它们。
相关文章:
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 常量引用函数参数的地址何时唯一?
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- 通过C 中的构造函数将地址参数传递给基类指针
- 将临时地址传递给带有指针参数的函数是否合法
- 仅通过参数查找重载地址
- 指针参数在C 中接收地址
- C++ lambda 对象的地址作为函数的参数
- 其地址作为参数传递的函数
- 获取模板类对象的地址将导致模板参数的完全实例化
- 使用绝对指针地址作为模板参数
- 将指针的地址作为参数传递
- C++函数参数丢失了部分地址
- 如何正确地将一个文本整数作为参数作为空指针进行传递,并使用其地址作为整数的实际值
- 如果指定了参数,如何将地址分配给函数指针
- 局部变量的内存地址根据 lambda 参数的预感而变化
- 从调用堆栈地址获取函数参数
- C ++如何将我的命令行参数(MAC地址)转换为无符号字符
- 为什么在解析 main() 参数时获取地址值
- 为什么在作为函数参数传递时无法更改类型为"const int *"的指针的地址?