首页 > 解决方案 > 如何将所有指针从一个向量移动到另一个向量?

问题描述

基本上我想要做的是删除向量中的一些指针,但我发现在向量中间执行此操作可能会很慢。

所以我有一个里面已经有数据的向量:

std::vector<Class*> vec1; // This already contains pointers

我将遍历 vec1 并将一些指针添加到另一个向量 (vec2):vec2.push_back(vec1.at(index))

现在我想做的是类似的事情,vec1 = vec2但我不知道这是否是更好(有效)的方法。

最好的方法是什么?

我试过了:

  1. 在遍历 vec1 时,只需删除我需要从中删除的内容:

    it = vec1.erase(it)

  2. 在遍历 vec1 时,将最后一项移动到实际索引和 poping_back

    vec1.at(index) = vec1.back(); vec1.pop_back();

  3. 在指针指向的对象上设置一些属性,同时循环通过 vec1 而不是使用std::remove_if

    vec1.erase(std::remove_if(vec1.begin(), vec1.end(), shouldBeRemoved), vec1.end());

  4. 现在我试图在循环遍历 vec1 并添加我想要保留的指针时生成一个新向量,然后将这个新向量的内容“交换”或“移动”到 vec1。

显然,当以第 4 种方式执行此操作时,指针会失效:(

我很想看看你们给我的建议。非常感谢所有愿意提供帮助的人!

标签: c++performancec++11

解决方案


您可以仅用于std::remove_if有条件地从向量中删除项目。该算法会将需要保留的项目移到前面。跟进std::vector::erase 调用以实际删除未移到前面的项目。

这类似于您的选项 3,但您不需要先设置属性 - 只需使用一个谓词来确定是否应该保留该项目,并避免必须两次传递向量。

如果您不想就地执行此操作,但想填充一个新向量,则std::copy_if执行此操作。


推荐阅读