Vit*_*meo 3 c++ erase-remove-idiom stl-algorithm c++11
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
enum class En{A, B};
std::vector<En> vec{En::A, En::B, En::A, En::B, En::A, En::B, En::A};
for(const auto& i : vec) std::cout << int(i) << ", ";
std::cout << std::endl;
vec.erase(std::remove(std::begin(vec), std::end(vec), vec.front()),
std::end(vec));
for(const auto& i : vec) std::cout << int(i) << ", ";
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Ideone:http://ideone.com/NTPVyE
打印:
0,1,0,1,0,1,0,
1,0,0,0,
为什么会这样?不应该只删除矢量的第一个元素吗?
我想std::remove不会停留在第一个元素,而是贯穿整个向量.有没有什么方法可以使用非独特元素的集合上的擦除删除习惯用法?
第三个参数std::remove是const参考.当您移动元素时,您正在更改引用的元素的值,从而导致未定义的行为.
这表现得很好:
auto elem = vec.front(); // copy front element
vec.erase(std::remove(std::begin(vec), std::end(vec), elem),
std::end(vec));
Run Code Online (Sandbox Code Playgroud)
输出:
1,1,1,
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |