gpt4 book ai didi

C++ lambda 删除偶数

转载 作者:太空狗 更新时间:2023-10-29 20:26:37 25 4
gpt4 key购买 nike

我正在学习 C++ lambda 函数,这个可能很简单的问题给我带来了一些问题。

我有一个包含一些整数的 vector 。我正在尝试删除所有偶数。

我目前用它删除偶数,但是当我打印 vector 的内容时,我在最后的 vector 中留下了一些重复的数据。

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());

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

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

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

关于C++ lambda 删除偶数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19283281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com