如何仅用指定方法实现无序vector去重并保留元素顺序?
C++ Vector 去重(保留元素顺序,仅用指定方法)
原代码问题分析
你当前的代码存在几个核心逻辑错误:
- 内层循环遍历原vector而非临时容器,判断逻辑颠倒——只要找到原vector中任意两个元素相等就添加,导致重复元素被多次插入tempVec
- 内层循环
j从1开始,跳过了原vector的第一个元素,导致初始元素无法被正确加入临时容器 - 最终没有将去重后的tempVec内容同步回传入的原vector,原容器不会发生任何变化
修改后的实现代码
void RemoveDuplicates(std::vector<int>& vec) { std::vector<int> tempVec; // 遍历原vector的每一个元素 for (int i = 0; i < vec.size(); ++i) { bool isDuplicate = false; // 检查当前元素是否已存在于去重后的临时容器中 for (int j = 0; j < tempVec.size(); ++j) { if (vec.at(i) == tempVec.at(j)) { isDuplicate = true; break; // 找到重复后立即终止内层循环,减少不必要遍历 } } // 仅当元素未重复时,加入临时容器 if (!isDuplicate) { tempVec.push_back(vec.at(i)); } } // 将原vector替换为去重后的内容 vec.resize(tempVec.size()); for (int k = 0; k < tempVec.size(); ++k) { vec.at(k) = tempVec.at(k); } }
代码说明
- 去重逻辑:对原vector的每个元素,遍历已去重的tempVec,确认该元素未被添加过再插入tempVec,确保只保留首次出现的元素
- 容器同步:通过
resize()调整原vector的大小与tempVec一致,再用at()逐个赋值,完成原容器的更新 - 优化细节:找到重复元素后立即跳出内层循环,避免无效遍历
测试验证
当输入序列为1 2 3 3时:
- 元素
1:tempVec为空,直接添加,tempVec变为[1] - 元素
2:遍历tempVec无匹配,添加后变为[1,2] - 元素
3:遍历tempVec无匹配,添加后变为[1,2,3] - 元素
3:遍历tempVec找到匹配,跳过添加 - 最终原vector被更新为
[1,2,3],符合预期
内容的提问来源于stack exchange,提问作者user20015647
相关产品推荐
相关产品推荐

