虽然在C++中常用到CString类,但是在win32控制台中并不是能很好的应用。在c语言中也存在着string这个标准库,用起来也是十分的强大。
首先unique这个函数。它能够将重复的字符进行折叠处理。
string str = "we need your help!";
unique(str.begin(),str.end());
cout<<str<<endl;
输出的结果是we ned your help!!。这个结果是这样的,首先unique这个函数只能够将相邻的两个字符进行比较,如果两个字符相同,则只保留一个。由于只有need是两个ee相邻,其他虽然有e但是其与左右并不相同。所以可以看到need变成了ned。其次为什么结果会多出个‘’!‘’呢?这是因为虽然unique对原字符串进行了折叠,但是原字符串大小并没有变化。unique的主要作用原理是将字符考出,折叠后再拷贝回原来的位置中。如果恰好没有被拷贝进来的字符覆盖,那么原来的字符仍然是保留的,这里的“!”第一个是原来拷贝出去的那个,由于缩减了一个字符,所以所有字符都向前移了 1位,那么最有一个‘!’就没有被覆盖。所以最终我们看到了这样的结果。如何将之后多出来的“!”删除呢?这里就要引入一个string类的成员函数erase()。
unique()函数返回的是迭代器,指向拷贝的后一个元素对象。而erase有三种用法。1,erase(num1,num2),将字符串从num1开始删除num2个字符。2,erase(iterator),删除iterator指向的字符。3,erase(iterator1,iterator2),删除iterator1到iterator2所指向的对象。
这里我们将用erase到第三种用法。
str.erase(unique(str.begin(),str.end()),str.end());
这样我们得到的结果就是we ned your help!.
那么如何将字符串中所有相同的数组只保留一个呢?聪明的你一定想到将字符中相同的字符放在一起不久好了吗!而这个就是sort函数完成的。不过记得要加上头文件<algorithm>。