vector数组去重
时间: 2025-03-23 21:08:14 浏览: 21
<think>嗯,用户想了解C++中如何对vector进行去重,特别是使用STL的unique和sort方法。首先,我需要回忆一下这两个函数的作用。unique通常需要先对vector排序,因为它只能去除相邻的重复元素,所以必须先排序让重复元素相邻。然后,unique返回去重后的新逻辑结尾的迭代器,接着用erase方法删除后面的多余元素。
记得用户提供的引用里提到了两种方法:一种是sort加unique和erase,另一种是使用std::set。这两种方法各有优缺点。第一种方法的时间复杂度主要是排序的O(n log n),而第二种方法构造set也是O(n log n),不过可能更简洁。需要详细说明这两种方法的步骤和代码示例。
用户可能需要具体的代码示例,所以得写出正确的C++代码。比如,在第一种方法中,先排序,然后调用unique,再erase。代码可能像这样:
vector<int> v = {1,2,3,1,2,3,3,4,5,4,5,6,7};
sort(v.begin(), v.end());
auto last = unique(v.begin(), v.end());
v.erase(last, v.end());
然后第二种方法是用set,直接把vector的元素插入到set中,因为set自动去重和排序。不过要注意,这样会改变原来的顺序,如果用户需要保持原顺序的话,这种方法可能不适用。这时候可能需要用unordered_set,不过那又会有不同的行为。
另外,用户可能需要知道这两种方法的适用场景。比如,如果允许排序后的结果,第一种方法更高效;如果需要保持插入顺序,可能需要遍历vector并记录已经出现的元素,手动去重,但时间复杂度更高。
还需要考虑是否处理自定义类型的vector,这时候可能需要提供比较函数或哈希函数。不过用户的问题可能集中在基本类型上,所以暂时可以省略这部分,但可以提到如果需要的话怎么做。
可能用户会问如何选择这两种方法,或者有没有其他方法,比如使用erase-remove惯用法,或者使用C++17的某些特性。不过根据引用中提到的,主要讨论两种方法。
最后要生成相关问题,可能包括性能比较、保持原顺序的去重方法,或者处理自定义对象的情况。需要确保问题相关且有帮助。</think>### C++ vector 去重方法及示例
在C++中,对`vector`进行去重的常用方法主要有以下两种,均基于STL算法实现:
---
#### **方法1:排序 + `unique`算法**
**步骤说明**
1. **排序**:使用`std::sort`对`vector`排序,使重复元素相邻
2. **去重**:使用`std::unique`将相邻重复元素移至容器末尾,并返回新逻辑结尾的迭代器
3. **删除**:通过`vector::erase`删除末尾的重复元素
**代码示例**
```cpp
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7};
// 1. 排序
std::sort(v.begin(), v.end());
// 2. 去重并获取新结尾迭代器
auto last = std::unique(v.begin(), v.end());
// 3. 删除重复元素
v.erase(last, v.end());
return 0;
}
```
**时间复杂度**:$O(n \log n)$,主要来自排序操作[^1]
---
#### **方法2:使用`std::set`**
**步骤说明**
1. **构造集合**:利用`std::set`自动去重的特性,直接插入`vector`元素
2. **转回`vector`**:将集合内容重新赋值给原`vector`
**代码示例**
```cpp
#include <vector>
#include <set>
int main() {
std::vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7};
// 1. 利用set去重
std::set<int> s(v.begin(), v.end());
// 2. 转回vector
v.assign(s.begin(), s.end());
return 0;
}
```
**特点**:代码更简洁,但会破坏原有顺序,且时间复杂度仍为$O(n \log n)$[^2]
---
#### **方法对比**
| 方法 | 是否保持顺序 | 额外空间复杂度 | 适用场景 |
|--------------------|--------------|----------------|----------------------|
| 排序+`unique` | 否 | $O(1)$ | 允许排序且需原地修改 |
| `std::set`转换 | 否 | $O(n)$ | 代码简洁性优先 |
---
阅读全文
相关推荐


















