假设我有 std::vector<std::pair<int,Direction>>
。
我正在尝试使用 erase-remove_if 习惯用法从向量中删除对。
stopPoints.erase(std::remove_if(stopPoints.begin(),
stopPoints.end(),
[&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));
我想删除所有将 .first 值设置为 4 的对。
在我的示例中,我有对:
- 4, Up
- 4, Down
- 2, Up
- 6, Up
但是,在我执行erase-remove_if 之后,我只剩下:
- 2, Up
- 6, Up
- 6, Up
我在这里做错了什么?
原文由 omegasbk 发布,翻译遵循 CC BY-SA 4.0 许可协议
正确的代码是:
您需要删除从
std::remove_if
返回的迭代器开始到向量末尾的范围,而不仅仅是单个元素。“为什么?”
std::remove_if
交换向量内的 元素,以便将所有与谓词不匹配的元素放在容器的开头。这意味着如果谓词(lambda 函数的主体)返回true
,那么该元素将被放置在向量的 末尾。remove_if
然后**返回一个迭代器,它指向与谓词**匹配的第一个元素。换句话说,指向要删除的第一个元素的迭代器。std::vector::erase
擦除从返回的迭代器到向量末尾的范围,这样 所有匹配谓词的元素都被删除。更多信息: Erase-remove idiom (Wikipedia) 。