我对 std::unique(算法)C++有问题

I have a problem with std::unique (algorithm) C++

本文关键字:C++ 算法 有问题 std unique 我对      更新时间:2023-10-16

我在找到 2 个最小数字时遇到问题。我得到的输出错误。

例:

  • 输入:{-1, 2, 5, 3, 8, -1, 3, 5, 0}
  • 输出:{-1, -1}
  • 正确答案:{-1, 2}

我相信unique有问题,因为它不会删除所有相同的数字。

有没有更好的方法

?以下是我的代码:

#include <iostream>
#include <vector>
#include <algorithm>
void input(std::vector<int> &vec) {
int num;
std::cin >> num;
if (num == 0){
return;
}

vec.push_back(num);
return input(vec);
}
int main() {
std::vector<int> vec;
input(vec);
unique(vec.begin(), vec.end()); // It doesnt work correctly
std::vector<int>::iterator it = min_element(vec.begin(), vec.end());
std::cout << "n" << *it << " ";
vec.erase(it);
it = min_element(vec.begin(), vec.end());
std::cout << *it << " ";
return 0;
}

数组需要排序才能unique正常工作。

@Mikhail回答了你的问题。但是,如果您排序然后使用std::unique,您将做比您需要的更多的工作。

实际上,您只需在集合中执行单个循环,即可以较低的复杂度解决此问题,从而找到两个最小的唯一值。我还没有检查下面的代码编译,但它会像这样。

#include <numeric>
#include <utility>
#include <limits>
#include <vector>
#include <iostream>
#include <cassert>
using namespace std;
pair<int, int> find_2_min_values(const vector<int>& collection)
{
assert(collection.size() > 1);
auto res = make_pair(numeric_limits<int>::max(),
numeric_limits<int>::max());

for (const auto& i : collection)
{
if (i < res.first)
res.first = i;
else if (i < res.second)
res.second = i; 
}
return res;
}
int main()
{
vector<int> col = {-1, 2, 5, 3, 8, -1, 3, 5, 0};    
auto res = find_2_min_values(col);
cout << "first: " << res.first << "n" 
<< "second: " << res.second << endl;
}

在某些边缘情况下,这无法正确处理,例如按降序排列的集合。