我对 std::unique(算法)C++有问题
I have a problem with std::unique (algorithm) C++
我在找到 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;
}
在某些边缘情况下,这无法正确处理,例如按降序排列的集合。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何在 Mac 上使用 c++17 并行标准库算法?