c++ - 使用 'auto' 擦除许多矢量元素
问题描述
假设我有vector
一对,每个pair
对应于我正在处理的某个矩阵的索引(行和列)
using namespace std;
vector<pair<int, int>> vec;
我想使用auto
遍历整个向量并立即删除所有满足某些条件的对,例如
for (auto& x : vec) {
if (x.first == x.second) {
vec.erase(x);
}
}
但它不起作用,因为我认为vec.erase()
应该有一个迭代器作为参数,x
实际上pair
是一个是 vector 的元素vec
,而不是迭代器。我尝试以几种方式对其进行修改,但我不确定如何通过容器元素auto
完全工作以及如何解决此问题。
我可以轻松修改上面的代码以使其正常工作并擦除向量的多个元素,同时使用auto
? 或者我应该修改我的方法?
现在它只是一个对的向量,但以后会更糟,所以为了简单起见,我想使用它auto
。
解决方案
vector::erase()
使任何未完成的迭代器无效,包括基于范围的 for 循环正在使用的迭代器。使用std::remove_if()
:
vec.erase(
std::remove_if(
vec.begin(),
vec.end(),
[](const pair<int,int> &xx) { return xx.first == xx.second; }
), vec.end()
);
std::remove_if()
将元素交换到向量的末尾,然后您可以安全地擦除它们。
推荐阅读
- rust - 为什么有符号整数的绝对值方法不返回无符号值?
- mapping - LiDAR Velodyne Veloview 点云数据
- machine-learning - GCP 的 CPU 使用率低
- arrays - 可以循环通过“太快”的函数破坏它(Node.js)
- scrapy - 刮痧。spider_close 调用后如何产生项目?
- pip - 无法在 Python3.6 上安装 enum 包
- scala - 从可能产生错误情况的 Akka 流中准备正确的 HTTP 响应
- vb.net - ImageResizer SimpleFilters VB.net 示例代码
- c# - 瞄准敌人时在玩家身后锁定相机
- javascript - 如何在css中启用页面加载时的悬停选项卡?