使用erase-remove_if 成语

新手上路,请多包涵

假设我有 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 许可协议

阅读 521
1 个回答

正确的代码是:

 stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool
                                       { return stopPoint.first == 4; }),
                 stopPoints.end());

您需要删除从 std::remove_if 返回的迭代器开始到向量末尾的范围,而不仅仅是单个元素。

“为什么?”

  • std::remove_if 交换向量内的 元素,以便将所有与谓词不匹配的元素放在容器的开头。这意味着如果谓词(lambda 函数的主体)返回 true ,那么该元素将被放置在向量的 末尾

  • remove_if 然后**返回一个迭代器,它指向与谓词**匹配的第一个元素。换句话说,指向要删除的第一个元素的迭代器。

  • std::vector::erase 擦除从返回的迭代器到向量末尾的范围,这样 所有匹配谓词的元素都被删除


更多信息: Erase-remove idiom (Wikipedia)

原文由 Vittorio Romeo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏