r-s*_*r-s 3 c++ lambda vector c++11
我正在学习C++ lambda函数,这个可能很容易的问题就是给我一些问题.
我有一个带有一些整数的向量.我想删除所有偶数.
我目前已经删除了偶数,但是当我打印向量的内容时,我最后还是在向量中留下了一些重复的数据.
int main()
{
std::vector<int> v1 = {0,1,1,2,3,5,8,13,21,55,89};
for (const auto &i : v1) std::cout<< i << " ";
std::cout<<std::endl;
v1.erase(std::remove_if(v1.begin(), v1.end(), [](int i)
{ return (i % 2) == 0; }));
for (const auto &i : v1) std::cout<< i << " ";
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
0 1 1 2 3 5 8 13 21 55 89
1 1 3 5 13 21 55 89 55 89
Run Code Online (Sandbox Code Playgroud)
我希望第二行的输出为:
1 1 3 5 13 21 55 89
Run Code Online (Sandbox Code Playgroud)
编辑
感谢大家.我使用了错误版本的擦除(现在觉得非常愚蠢).这是正确的代码:
int main()
{
std::vector<int> v1 = {0,1,1,2,3,5,8,13,21,55,89};
for (const auto &i : v1) std::cout<< i << " ";
std::cout<<std::endl;
v1.erase(std::remove_if(v1.begin(), v1.end(), [](int i)
{ return (i % 2) == 0; }), v1.end());
for (const auto &i : v1) std::cout<< i << " ";
}
Run Code Online (Sandbox Code Playgroud)
你正在使用std::vector::erase带有单个迭代器的重载.
这是所需的过载:
iterator erase(const_iterator first, const_iterator last);
Run Code Online (Sandbox Code Playgroud)
你的目标是:
auto is_even = [](int i) { return (i % 2) == 0; };
v1.erase(std::remove_if(v1.begin(), v1.end(), is_even), v1.end());
Run Code Online (Sandbox Code Playgroud)
此重载将擦除之间的元素first和last.
std::remove_if修改范围,使其仅包含不满足谓词函数定义的条件的元素.然后它将迭代器返回到范围的新结尾.
擦除通过实际删除容器中的元素来完成作业.