c – 使用erase-remove_if惯用法

前端之家收集整理的这篇文章主要介绍了c – 使用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

我在这做错了什么?

解决方法

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

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

“为什么?”

> std :: remove_if在向量内部交换元素,以便将与谓词不匹配的所有元素放到容器的开头.

>然后返回指向第一个谓词匹配元素的迭代器.
> std :: vector :: erase需要擦除从返回的迭代器开始到向量末尾的范围,以便删除与谓词匹配的所有元素.

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

猜你在找的C&C++相关文章