C++ lambda 删除偶数
c++ lambda remove even numbers
我正在学习 lambda 函数C++,这个可能很简单的问题给我带来了一些问题。
我有一个包含一些整数的向量。我正在尝试删除所有偶数。
我目前让它删除偶数,但是当我打印矢量的内容时,最后我留下了一些重复的数据仍在矢量中。
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 << " ";
}
您正在使用采用单个迭代器的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());
此重载将擦除 first
和 last
之间的元素。
std::remove_if
修改范围,使其仅包含不满足谓词函数定义的条件的元素。然后,它将迭代器返回到范围的新端。
擦除通过实际从容器中删除元素来完成作业。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 从链接列表c++中删除一个项目
- 如何使用lambda作为std::unique_ptr的删除器?
- Unique_ptr与 lambda 删除器
- 使用 lambda/std::function 删除拥有该函数的对象
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 如果我在lambda中删除容纳lambda的对象,那会发生什么
- 如何避免多个删除程序 lambda
- 如何使用lambda和函数作为unique_ptr的自定义删除程序
- 使用 lambda 函数从 std::vector 中删除特定块
- 通过 lambda 删除矢量项
- C++ lambda 常量值引用在线程中删除
- C++ lambda 删除偶数
- unique_ptr<T> 用于数组专用化的 lambda 自定义删除器
- std::唯一指针和自定义lambda删除器错误
- 了解Lambda闭包类型如何删除默认构造函数
- vc2013与2015中的Lambda删除器