c ++ lambda删除偶数

时间:2013-10-09 21:41:05

标签: c++ c++11 vector lambda

我正在学习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 << " ";
}

输出:

0 1 1 2 3 5 8 13 21 55 89 
1 1 3 5 13 21 55 89 55 89

我希望第二行的输出为:

1 1 3 5 13 21 55 89

修改

谢谢大家。我使用了错误版本的擦除(现在觉得非常愚蠢)。这是正确的代码:

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 << " ";
}

1 个答案:

答案 0 :(得分:6)

您正在使用带有单个迭代器的std::vector::erase重载。

这是所需的重载:

iterator erase(const_iterator first, const_iterator last);

你的目标是:

auto is_even = [](int i) { return (i % 2) == 0; };
v1.erase(std::remove_if(v1.begin(), v1.end(), is_even), v1.end());

此重载将删除firstlast之间的元素。

std::remove_if修改范围,使其仅包含不满足谓词函数定义的条件的元素。然后它将迭代器返回到范围的新结尾。

擦除通过实际删除容器中的元素来完成作业。