使用unique来删除重复元素

C++ STL库中的algorithm库包含了一个unique函数可以用来删除容器中重复的元素,其只能删除相邻近的重复元素,所以如果要使容器中的所有元素都去重,则需要事先对元素进行排序,但这会破坏原先元素的排列顺序,此时应该使用另一种方法解决。

unique()原型
template<class ForwardIterator>
ForwardIterator unique(ForwardIterator fist, ForwardIterator last);

template<class ForwardIterator, class BinaryPredecate>
ForwardIterator unique(ForwardIterator fist, ForwardIterator last, BinaryPredicate pred);

unique()函数将[first, last)区间中由两个或更多相同元素构成的序列压缩成为一个元素,并返回新区间的超尾迭代器。第一个版本使用值类型的= =运算符对元素进行比较(如果元素是结构体或者类,需要事先重载= =运算符);第二个版本使用二元谓词函数对象pred来比较元素。也就是说,如果pred(*it1, *it2)为true,则t1和t2指向的元素是匹配的。

// 假如元素的类型为Student
bool pred(Student t1, Studentt2) { return t1 == t2; }

unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。函数的返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。如果不使用erase成员函数进行处理,则元素的个数与最初时一样,结果会出错。所以unique需要搭配erase函数进行删除操作

auto itend = unique(str.begin(), str.end();
str.erase(itend, str.end());
测试用例
/*
编写一个程序,去掉给定字符串重复的字符。例如输入 google 输出 gole 
*/

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
	string str;
	while (cin >> str)
	{
		auto itend = unique(str.begin(), str.end());
		str.erase(itend, str.end());
		cout << str << endl;
	}

	return 0;
}

如果注释掉erase语句,则会出现如下情况
错误情况
配合erase删除掉末尾不需要的元素之后,结果如下
正确情况

发布了16 篇原创文章 · 获赞 4 · 访问量 475

猜你喜欢

转载自blog.csdn.net/benobug/article/details/104940528
今日推荐