【c++】unique去重问题和sort排序问题

如果输入一个str(string)你想给它去重我想到的第一个笨方法
	string str{ "aaccdd" };
	set<char> a;
        for (auto & it : str)
        {
            a.insert(it);
        }
        str.clear();
        for (auto & it : a)
        {
            str += it;
        }//结果acd
其实利用标准库可以很简单:
#include <algorithm>//注意头文件
string str{ "aaccdd" };
unique(str.begin(), str.end());
 cout << str << endl;//结果acdcdd

上面的结果acd后不是剩余的重复元素和Primer讲的不一样,
但下面的处理解决方法和Primer的一样。

string str{ "aaccdd" };
 auto it=unique(str.begin(), str.end());//返回去重后的迭代器
 str.erase(it, str.end());//删除操作
 cout << str << endl;//结果acd
string str{ "aaccddaacc" };
 auto it=unique(str.begin(), str.end());
 str.erase(it, str.end());
 cout << str << endl;//结果acdac
为什么使用unique函数先去重后排序会让一些重复的元素又在一起了呢?

建议还是去看看unique的源码,事实上,unique函数实现的只是相邻相同元素的去重,因此实现方式跟我们想象的去重函数不完全一样。

因此,unique函数本身是不能实现对未排序的序列的去重的。

我试了一下,如果输入数组是
int as[10] = {1,2,2,3,3,3,2,2,1,1}; 则
unique(as,as+10)-as的值是5,输出数组为{1 2 3 2 1 3 2 2 1 1},
这个输入数组重复的元素在前后都有,所以输出了一个奇奇怪怪的结果出来。而且真正从时间复杂度的角度讲,即便没有库函数unique,也应该先排序后去重,原因嘛,都明白的。

跑题了,回来
string str{ "aaccddaacc" };
 sort(str.begin(), str.end());//str:aaaaccccdd
 auto it =unique(str.begin(), str.end());
 str.erase(it, str.end());
 cout << str << endl;

通过sort排序将重复的元素置为相邻 再去重。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值