gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:08:20 25 4
gpt4 key购买 nike

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

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

一种方法是将 remove_if 与谓词仿函数 InInds 结合使用,谓词仿函数 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 通常会将未删除的元素移向范围的开头。您需要将未删除的元素复制到另一个容器,而不是就地删除它们。

关于c++ - 是否允许 STL 谓词使用其参数的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com