gpt4 book ai didi

c++ - 使用 erase-remove_if 习语

转载 作者:可可西里 更新时间:2023-11-01 17:03:29 24 4
gpt4 key购买 nike

假设我有 std::vector<std::pair<int,Direction>> .

我正在尝试使用 erase-remove_if 习惯用法从 vector 中删除对。

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

我在这里做错了什么?

最佳答案

正确的代码是:

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

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

“为什么?”

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

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

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


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

关于c++ - 使用 erase-remove_if 习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39019806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com