You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
}

关键修改点说明

  1. 输入时直接处理顺序:不再先把所有元素插入unordered_set再遍历,而是在输入每个元素时就判断是否重复,保证answer里的顺序和输入一致
  2. 简化输出逻辑:用group_sizes记录每组的元素个数,遍历输出时直接按组分割,避免原代码中复杂的计数逻辑
  3. 变量命名更清晰:将Uniq改为existed,Answer改为answer,提升代码可读性

内容的提问来源于stack exchange,提问作者AwangardowyEkstrawagant 12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:45:53