c++ - 如何将所有指针从一个向量移动到另一个向量?
问题描述
基本上我想要做的是删除向量中的一些指针,但我发现在向量中间执行此操作可能会很慢。
所以我有一个里面已经有数据的向量:
std::vector<Class*> vec1; // This already contains pointers
我将遍历 vec1 并将一些指针添加到另一个向量 (vec2):vec2.push_back(vec1.at(index))
现在我想做的是类似的事情,vec1 = vec2
但我不知道这是否是更好(有效)的方法。
最好的方法是什么?
我试过了:
在遍历 vec1 时,只需删除我需要从中删除的内容:
it = vec1.erase(it)
在遍历 vec1 时,将最后一项移动到实际索引和 poping_back
vec1.at(index) = vec1.back(); vec1.pop_back();
在指针指向的对象上设置一些属性,同时循环通过 vec1 而不是使用
std::remove_if
vec1.erase(std::remove_if(vec1.begin(), vec1.end(), shouldBeRemoved), vec1.end());
现在我试图在循环遍历 vec1 并添加我想要保留的指针时生成一个新向量,然后将这个新向量的内容“交换”或“移动”到 vec1。
显然,当以第 4 种方式执行此操作时,指针会失效:(
我很想看看你们给我的建议。非常感谢所有愿意提供帮助的人!
解决方案
您可以仅用于std::remove_if
有条件地从向量中删除项目。该算法会将需要保留的项目移到前面。跟进std::vector::erase
调用以实际删除未移到前面的项目。
这类似于您的选项 3,但您不需要先设置属性 - 只需使用一个谓词来确定是否应该保留该项目,并避免必须两次传递向量。
如果您不想就地执行此操作,但想填充一个新向量,则std::copy_if
执行此操作。
推荐阅读
- javascript - 如何通过引用传递 vuejs 元素实例
- android - 使用 RecyclerView 和 Retrofit2 最新没有数据
- angular - 角度 2/5/6 中 document.getElementsByTagName('body') 的替代方案
- mysql - 如何安全地存储 API 令牌?
- json - Golang 使用未知键解析 JSON
- java - 从日期范围选择中选择第一个和最后一个日期
- node.js - jenkins中具有不同环境的节点应用程序
- c++ - 使用临时初始化 gtest 夹具参考类成员
- swift - 我无法理解方法行为
- aop - How to add arguments to Spring AOP aspect