c++双重vector去除重复元素
时间: 2025-02-12 15:21:45 浏览: 66
### 如何在 C++ 中去除嵌套向量中的重复元素
为了处理嵌套 `std::vector` 的去重操作,可以采用多种方法。一种常见的方式是利用标准库函数和容器特性来简化这一过程。
#### 方法一:使用集合(Set)
通过将内部向量转换为 `std::set` 来自动移除重复项,因为集合不允许存在相同的键值:
```cpp
#include <iostream>
#include <vector>
#include <set>
void removeDuplicates(std::vector<std::vector<int>>& vec) {
std::set<std::pair<int, int>> seen;
auto it = vec.begin();
while (it != vec.end()) {
bool unique = true;
for (const auto& elem : *it) {
if (!seen.insert({elem, 0}).second) { // 如果插入失败,则表示已经存在该元素
unique = false;
break;
}
}
if (!unique) {
it = vec.erase(it); // 删除当前迭代器指向的子向量并更新迭代器
} else {
++it; // 移动到下一个位置
}
seen.clear(); // 清空用于下一轮比较
}
}
```
这种方法适用于当内层向量较短的情况;但如果内层也很大,则效率会受到影响[^1]。
#### 方法二:基于排序加唯一化(Sort + Unique)
对于更高效的解决方案,特别是针对较大的数据集,先对整个二维数组进行排序再调用 `std::unique()` 函数是一个不错的选择:
```cpp
#include <algorithm> // sort(), unique()
#include <iterator> // back_inserter()
// 假设输入的是一个整数类型的二维向量
template<typename T>
void deduplicateNestedVector(std::vector<T>& v){
// 首先对外部向量按字典序排序
std::sort(v.begin(), v.end());
// 使用 erase-remove idiom 和 unique() 来消除相邻相等元素
v.erase(
std::unique(v.begin(), v.end()),
v.end());
}
int main(){
std::vector<std::vector<int>> data{{1},{2},{3},{1},{2}};
deduplicateNestedVector(data);
for(const auto &subvec:data){
for(int val: subvec)
std::cout << val << ' ';
std::cout<<'\n';
}
}
```
此代码片段展示了如何定义通用模板版本以适应不同类型的嵌套向量,并且实现了外部向量级别的去重逻辑。如果还需要进一步深入至单个子向量内的元素级别去重,可以在上述基础上增加一层循环来进行相同的操作。
阅读全文
相关推荐


















