使用unordered_set去重无法保留输入顺序的问题求助
问题分析与解决方案:去重并保留输入顺序的C++实现
核心问题
你遇到的问题本质是**unordered_set不保证遍历顺序与插入顺序一致**。它基于哈希表实现,元素的存储位置由哈希值决定,遍历顺序是哈希桶的顺序,和插入顺序无关,所以会出现看似随机的输出顺序,并非真正的排序。
解决方案
要实现「去重且保留输入顺序」,需要结合unordered_set(快速判断元素是否存在)和vector(记录插入顺序):
- 遍历输入的每个元素时,先用
unordered_set检查该元素是否已经出现过 - 如果未出现,将其同时插入
unordered_set和结果vector,这样vector里的元素就是去重后的输入顺序
修改后的代码
#include <iostream> #include <vector> #include <unordered_set> using namespace std; int main() { int t, n, l; unordered_set<int> existed; // 用于快速判断元素是否已存在 vector<int> answer; vector<int> group_sizes; // 记录每组去重后的元素个数 cin >> t; for (int i = 0; i < t; ++i) { existed.clear(); // 每组开始前清空集合 int count = 0; cin >> n; for (int j = 0; j < n; ++j) { cin >> l; // 元素未出现过,才加入结果和集合 if (existed.find(l) == existed.end()) { existed.insert(l); answer.push_back(l); ++count; } } group_sizes.push_back(count); } // 按格式输出结果 int idx = 0; for (int size : group_sizes) { for (int i = 0; i < size; ++i) { if (i == size - 1) { cout << answer[idx++] << endl; } else { cout << answer[idx++] << " "; } } } return 0; }
关键修改点说明
- 输入时直接处理顺序:不再先把所有元素插入
unordered_set再遍历,而是在输入每个元素时就判断是否重复,保证answer里的顺序和输入一致 - 简化输出逻辑:用
group_sizes记录每组的元素个数,遍历输出时直接按组分割,避免原代码中复杂的计数逻辑 - 变量命名更清晰:将
Uniq改为existed,Answer改为answer,提升代码可读性
内容的提问来源于stack exchange,提问作者AwangardowyEkstrawagant 12
相关产品推荐
相关产品推荐

