关于STL中vector使用unique()去重的问题

本文介绍了 C++ STL 中 Unique 函数的使用方法,并通过示例展示了如何利用该函数去除容器中相邻的重复元素。此外,还提供了一种不依赖排序的去重方法。
STL中Unique函数的作用是去除相邻重复元素
#include
#include
#include
using namespace std
int main()
{
int a[10] = {7,4,1,7,4,1,7,4,1,0};
sort(a,a+10);//小到大

vector<int>ver(a,a+10);

vector<int>::iterator iter = unique(ver.begin(),ver.end());
ver.erase(iter,ver.end());
forint *t = ver.begin() ; t != ver.end() ; t ++ )
printf("%d ",*t);
return 0;
}
数组排完序之后的结果是a[10]={0,1,1,1,4,4,4,7,7,7};
故此段程序的输出结果是0 1 4 7


另外,也可以实现vector的不排序去重:
方法是在遍历的时候,将相等的元素除第一个外,后面的统统作标记。如:一个字符序列,可以用数字0来标记。应该说,直接将0赋值给这个元素。然后通过另一个容器,在遍历原容器的同时,将没有做标记的元素Push_back 到新容器中。
在C++中,`std::unique` 函数可以用于除相邻的重复元素。需要注意的是,`std::unique` 只会移除连续相同的元素,并不会真正删除容器中的元素(即减少容器大小),而是将其余下的有效元素向前移动并将后面的值设置为未指定状态(通常是原始序列末尾那些被覆盖掉的位置)。因此,在使用 `std::unique` 之后,需要配合 erase 成员函数来完成真正的物理删除并调整容器大小。 下面是一个简单的例子演示如何结合 `vector` 容器与 `std::sort()` 和 `std::unique()` 实现对整个集合的效果: ### 示例代码 ```cpp #include <iostream> #include <algorithm> // 包含 sort()unique() #include <vector> int main(){ std::vector<int> v = {5, 4, 6, 7, 8, 9, 4, 5, 6}; // 首先排序数组使得所有相等元素成为邻居 std::sort(v.begin(), v.end()); // 然后使用 std::unique 除相邻复项 auto new_end = std::unique(v.begin(), v.end()); // 使用 vector 的 erase 方法缩小容器规模至新的末端位置 v.erase(new_end, v.end()); for (auto n : v) { std::cout << n << ' '; } return 0; } ``` 上述代码首先将向量中的整数进行了升序排列,然后利用 `std::unique` 将连续出现多次的数字只保留第一次出现的结果,最后通过调用 `erase` 移除了多余的副本。 对于其他类型的 STL 容器比如 list 或 deque,也可以采用类似的方式工作;然而由于 set 和 unordered_set 已经内置了唯一键的功能,所以并不需要用 `std::unique` 对它们做额外处理。 如果希望直接在一个无序的范围内寻找和消除所有的冗余而不必事先对其进行完全排序,则可以考虑使用更复杂的算法或自定义解决方案,如哈希表辅助法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值