gpt4 book ai didi

c++ - 如何过滤 vector 并返回指向 vector 元素的指针 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:10 25 4
gpt4 key购买 nike

当使用原始数据类型过滤 vector 时,我通常这样做:

std::vector<int> v1 = {1,2,3,4,5};
std::vector<int> v2;
std::copy_if(v1.begin(), v1.end(), std::back_inserter(v2),
[](int const& x) { return criterion(x); } );

现在我有一个 vector ,其中包含巨大的对象,复制起来非常昂贵。我想要一个指向原始 vector 的特定元素的指针 (std::vector) 列表,具体取决于它们是否满足谓词条件。

我的第一个想法是自己创建这种 vector ,用指向所有元素的指针填充它,然后使用 copy_if 将元素过滤到第三个 vector 中。另一个想法是使用循环来执行此操作。完成此任务的最佳方法是什么?我应该使用引用而不是指针吗?

最佳答案

原始指针适用于非拥有语义,但您必须能够保证它们保持有效 <=> vector 不会被重新分配。

vector 中的索引更加稳健,只有当对象改变位置/被移除时它们才会过时。

无论如何,如果对象的复制成本很高,那么移动它们是否也很昂贵?考虑 std::unique_ptr 然后堆分配它们(std::shared_ptr 可能仍然太重,即使你使用 std::make_shared )。

如果您只需要序列一次(或者计算谓词的成本很低,并且选定元素与未选定元素的比率在可接受的范围内),则可以考虑传递一个自定义迭代器,它会即时进行过滤。 (例如:boost::filter_iterator)

关于c++ - 如何过滤 vector 并返回指向 vector 元素的指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24495902/

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