std::中lambda函数的独特用法

问题描述 投票:0回答:1

我编写了一个 cpp 代码来迭代向量。在将后续出现视为重复项之前,它允许每个元素最多出现两次。

int main() {

    std::vector<int> vec =  {1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5};

    std::sort(vec.begin(), vec.end()); 
    auto last = std::unique(vec.begin(), vec.end(),[count = 1](const auto& a, const auto& b) mutable
    {
        if(a != b)
        {   
            count = 1;
            return false ; 
        }else{
            return ++count > 2; 
        
        }
    });
    vec.erase(last, vec.end()); 
    
    for(auto it = vec.begin(); it != vec.end(); ++it){std::cout << *it << '\n'; }
   return 0; 
}

当我运行代码时,结果如下,

1 1 1 2 3 3 4 5 5

这不是想要的结果,我们可以看到有 3 个,共 1 个。所以我的问题是,关于向量的第一个元素,这个问题是如何产生的?

我在 lambda 体上做了一些工作。然而,这只会带来更复杂的问题。

c++ function lambda unique
1个回答
0
投票

std::unique
@cppreference.com:

使用给定的二元谓词

p
比较元素。如果不是等价关系,则行为未定义。

由于您的 BinaryPredicate 在运行算法的过程中更改了两个元素是否被视为相等,因此它不满足等价关系要求 - 因此您的程序具有 未定义的行为

© www.soinside.com 2019 - 2024. All rights reserved.