C++ 通过Lambda删除向量项

C++ 通过Lambda删除向量项,c++,vector,C++,Vector,我只是在摆弄一些lambda表达式,我决定尝试从向量中删除重复的元素。然而,它不起作用。我加入了一些调试日志记录,似乎std::count没有返回预期的结果。如有任何疑问,将不胜感激 作为参考,我知道这不是从向量中删除项目的最有效方法!我只是在尝试lambdas,因为我对它们的理解不如我想的那么好 谢谢 #include <vector> #include <algorithm> #include <iostream> int main() { st

我只是在摆弄一些lambda表达式,我决定尝试从向量中删除重复的元素。然而,它不起作用。我加入了一些调试日志记录,似乎std::count没有返回预期的结果。如有任何疑问,将不胜感激

作为参考,我知道这不是从向量中删除项目的最有效方法!我只是在尝试lambdas,因为我对它们的理解不如我想的那么好

谢谢

#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;
}
#包括
#包括
#包括
int main()
{
向量v={0,0,1,2,4,4,4};
std::remove_if(v.begin()、v.end()、[&v](常量int&x)
{ 
返回std::count(v.begin(),v.end(),x)>1;
});
std::cout这是因为实际上不删除元素:

std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());
移除是通过移动(通过移动指定)范围内的元素,使不被移除的元素出现在范围的开头

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

调用remove之后通常会调用容器的erase方法,该方法会擦除未指定的值并减小容器的物理大小以匹配其新的逻辑大小

即:

v.erase(std::remove_if(v.begin(), v.end(), [&v](const int &x) 
{ 
    return std::count(v.begin(), v.end(), x) > 1;
}), v.end());
这就是我们所知道的

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



感谢您的洞察力!有两件事:1)我试图保持秩序,2)不幸的是,这将删除所有重复项,直到元素不再存在。例如,向量中有两个0,但我实际上希望删除其中一个(保留第二个).我想做的事情是否不可能像我想做的那样?谢谢!@jhammond这里有两个很好的解决方案:和。