C++ vector有去重吗
时间: 2024-06-14 10:08:47 浏览: 371
C++的标准库中的vector容器本身并没有提供去重的功能,但是我们可以通过一些方法来实现vector的去重操作。以下是一种常见的去重方法:
1. 使用sort和unique函数:首先,使用sort函数对vector进行排序,然后再使用unique函数将重复的元素移到vector的末尾,并返回指向第一个重复元素的迭代器。最后,使用erase函数将重复元素从vector中删除。
示例代码如下:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 2, 4, 3, 5};
// 对vector进行排序
std::sort(vec(), vec.end());
// 使用unique函数去重
auto last = std::unique(vec.begin(), vec.end());
// 删除重复元素 vec.erase(last, vec.end());
// 输出去重后的vector
for (const auto& num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
```
输出结果为:1 2 3 4 5
这样就实现了对vector的去重操作。
相关问题
c++对vector去重
### C++ Vector 去重方法
在 C++ 中,`std::vector` 是一种动态数组容器,支持多种方式实现去重功能。以下是几种常见的 `std::vector` 去重方法及其代码示例。
#### 方法一:使用 `sort()` 和 `unique()`
通过先对 `std::vector` 排序再调用 `std::unique()` 来移除相邻的重复元素。最后利用迭代器删除多余的元素[^1]。
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v = {3, 4, 5, 1, 2, 5, 3};
// 首先对向量进行排序
sort(v.begin(), v.end());
// 使用 unique 移动重复元素至末尾并返回新末端位置
auto new_end = unique(v.begin(), v.end());
// 删除多余部分
v.erase(new_end, v.end());
cout << "去重后的结果: ";
for (const auto& elem : v) {
cout << elem << ' ';
}
cout << endl;
return 0;
}
```
此方法适用于基本类型的 `std::vector` 或者实现了 `<` 操作符的自定义类型[^2]。
---
#### 方法二:使用 `std::set` 自动去重
由于 `std::set` 不允许存储重复键值,因此可以借助它来完成去重任务。将原始数据插入到 `std::set` 后重新拷贝回来即可[^4]。
```cpp
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main() {
vector<int> numbers = {1, 2, 3, 2, 4, 3, 5, 6, 4};
// 将向量中的元素复制到 set 中以自动去重
set<int> uniquenumbers(numbers.begin(), numbers.end());
// 清空原向量并将唯一值放回去
numbers.assign(uniquenumbers.begin(), uniquenumbers.end());
cout << "去重后的结果: ";
for (const auto& num : numbers) {
cout << num << ' ';
}
cout << endl;
return 0;
}
```
这种方法的优点在于无需手动处理逻辑复杂度较高的算法细节,缺点则是可能引入额外开销(如排序)以及改变了原有顺序[^4]。
---
#### 方法三:基于哈希表的快速去重 (`unordered_set`)
如果希望保留输入序列原有的排列次序,则可以选择结合 `unordered_set` 实现高效的线性时间复杂度下的去重过程[^3]。
```cpp
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
vector<int> input = {1, 2, 3, 2, 4, 3, 5, 6, 4};
unordered_set<int> seen;
vector<int> result;
for (const auto& item : input) {
if (seen.find(item) == seen.end()) {
result.push_back(item);
seen.insert(item);
}
}
cout << "去重后的结果: ";
for (const auto& val : result) {
cout << val << ' ';
}
cout << endl;
return 0;
}
```
该方案特别适合那些需要保持初始顺序的应用场景,并且相比其他两种方法通常具有更好的性能表现[^3]。
---
### 总结
以上介绍了三种主流的 C++ `std::vector` 去重技术,分别是基于标准库组件组合而成的传统做法、依赖关联容器特性简化流程的方式还有兼顾效率与灵活性的新颖手段。开发者可以根据实际需求选取最合适的策略加以应用。
C++vector去重
C++中有多种方式可以从`vector`中去除重复元素。以下是两种常见的方法:
1. 利用`set`容器的特性去重[^1]:
```cpp
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main() {
vector<int> test={1,2,3,3,3,4,2,3,5,2,63,56,34,24};
set<int> s(test.begin(), test.end()); // 使用set自动去重并保持顺序
test.assign(s.begin(), s.end()); // 重新填充vector
for (int x : test)
cout << x << " ";
return 0;
}
```
2. 直接在vector内使用`unique()`函数去重:
```cpp
#include <iostream>
#include <vector>
#include <algorithm> // 包含unique函数
using namespace std;
int main() {
vector<int> test={1,2,3,3,3,4,2,3,5,2,63,56,34,24};
sort(test.begin(), test.end()); // 先排序以便unique生效
test.erase(unique(test.begin(), test.end()), test.end()); // 去除重复并更新end迭代器
for (int x : test)
cout << x << " ";
return 0;
}
```
这两种方法都能有效去除`vector`中的重复元素,第一种方法通过将vector转换为set实现去重,然后回填至vector;第二种方法则是直接在vector上操作,利用`unique()`找到连续的重复部分并删除。
阅读全文
相关推荐














