如果输入一个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排序将重复的元素置为相邻 再去重。