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

标签 c++ stdvector

当使用原始数据类型过滤 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/

相关文章:

c++ - 我应该使用 shared_ptr 还是 unique_ptr?

c++ - Visual Studio 2012 可以将 C++ 代码反向工程为 UML 图吗?

c++ - 编译时检查变量是否有符号/无符号

C++ 尝试制作游戏,但在 while 循环中返回函数值时遇到问题。将不胜感激

c++ - 如果我有一个父类(super class)类型的集合,如何获取特定子类类型的所有项目?

c++ - 引用 vector 中的特定索引

c++ - 使用标准句柄后如何将背景颜色恢复为以前的颜色

c++ - 如何使用带有 future<T> vector 的基于范围的 for 循环

c++ - vector 迭代器不兼容

c++ - 如何将数组的内容附加到 std::vector ?