假设我有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需要擦除从返回的迭代器开始到向量末尾的范围,以便删除与谓词匹配的所有元素.