C++ 删除存在于另一个矢量中的矢量项,同时保留顺序
C++ Remove vector items that exist in another vector WHILE retaining order
std::vector<int> items = {1, 2, 3, 4, 5};
std::vector<int> removeItems = {2, 4};
我需要删除items
中removeItems
中的值,同时保留items
的顺序。像这样:
items.remove(removeItems);
输出
项目 = {1, 3, 5}
是否有任何内置的向量方法可以实现这一点?我还没有找到任何接受另一个要删除的项目向量。如果没有,实现这一目标的最有效方法是什么?
编辑
擦除矢量中的元素 这篇文章指的是一次删除一个项目,我希望以更紧凑的方式一次删除一大堆
for(num in removeItems) {
items.erase(std::remove(items.begin(), items.end(), num), items.end())
}
因为这种删除项目的方法肯定非常低效,因为您必须检查整个items
向量两次(removeItems.size()
removeItems
中的每个项目编辑 2
items
或removeItems
中的元素数将在 0-10000 范围内
最有效的常规形式是将removeItems
转换为无序集合,然后通过检查成员资格从items
中删除元素。
std::unordered_set<int> removeSet(removeItems.begin(), removeItems.end());
items.erase(std::remove_if(items.begin(), items.end(), [&](int x) {
return removeSet.count(x) != 0;
}), items.end());
如果removeItems
很小,线性扫描可能比将其转换为无序集更快。对于大removeItems
上述是最有效的,除非它具有非常特殊的形式(例如只有小元素(。
如果两个数组都已经排序(就像在你的例子中一样,假设这不是巧合(,你可以比上面做得更好。
您可以应用擦除删除成语,借助std::remove_if
和std::find
。
std::vector<int> items = {1, 2, 3, 4, 5};
std::vector<int> removeItems = {2, 4};
items.erase(std::remove_if(std::begin(items),
std::end(items),
[&removeItems](auto i) { return std::find(std::begin(removeItems), std::end(removeItems), i) != std::end(removeItems); }),
std::end(items));
请注意,std::remove_if
只是将要删除的元素移动到vector
的后面;这些元素稍后会被std::vector::erase
擦除。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 有根的二进制搜索树.保留与其父级的链接
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 为多个会话保留XPtr
- C++ 删除存在于另一个矢量中的矢量项,同时保留顺序
- 保留从一个多集复制到另一个多集的元素的顺序
- STL 排序,保留原始顺序
- 按顺序保留多线程API的传入请求订单
- cmake target_link_libraries不保留顺序
- 我如何保留乘法和分区的顺序
- 为什么在打印东西时没有保留顺序,先用cerr,然后用cout
- 在 c++ 中,基于范围的 for 循环将保留索引顺序
- unordered_set::erase(pos)是否保留元素的顺序?
- 递归到迭代,保留变量和调用顺序
- 是否 boost::asio::io_service 保留处理程序的顺序
- STL容器,保留插入顺序,但不允许重复
- Qt库中的mapreduce是否保留输入文件的顺序?