gpt4 book ai didi

c++ - 通过 Lambda 删除 vector 项

转载 作者:行者123 更新时间:2023-11-30 03:54:19 27 4
gpt4 key购买 nike

我只是在摆弄一些 lambda 表达式,我决定尝试从 vector 中删除重复的元素。但是,它不起作用。我输入了一些调试日志,看起来 std::count 没有返回预期的结果。任何将不胜感激。

作为引用,我知道这不是从 vector 中删除项目的最有效方法!我只是在试验 lambda,因为我对它们的理解并不如我所愿。

谢谢!

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
std::vector<int> v = { 0, 0, 1, 2, 4, 4, 4 };

std::remove_if(v.begin(), v.end(), [&v](const int &x)
{
return std::count(v.begin(), v.end(), x) > 1;
});

std::cout << "\n\nResult:\n";
for (const auto& i : v) { std::cout << i << std::endl; }

return 0;
}

最佳答案

那是因为remove_if实际上并不删除元素:

Removing is done by shifting (by means of move assignment) the elements in the range in such a way that the elements that are not to be removed appear in the beginning of the range.

这就是它返回迭代器的原因,因此您可以:

A call to remove is typically followed by a call to a container's erase method, which erases the unspecified values and reduces the physical size of the container to match its new logical size.

即:

v.erase(std::remove_if(v.begin(), v.end(), [&v](const int &x) 
{
return std::count(v.begin(), v.end(), x) > 1;
}), v.end());

这被称为 Erase-remove idiom .

请注意,如果您只想删除重复项,而不关心保留顺序,则可以使用 std::sortstd::unique (您需要排序,因为unique 仅“删除”连续 重复元素):

std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());

关于c++ - 通过 Lambda 删除 vector 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614586/

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