我编写了一个 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 体上做了一些工作。然而,这只会带来更复杂的问题。
std::unique
@cppreference.com:
使用给定的二元谓词
比较元素。如果不是等价关系,则行为未定义。p
由于您的 BinaryPredicate 在运行算法的过程中更改了两个元素是否被视为相等,因此它不满足等价关系要求 - 因此您的程序具有 未定义的行为。