C++STL算法篇unique去重算法

unique的作用

答:去除相邻的重复元素。所以使用前最好先对容器内容进行排序,使用时应包含头文件algorithm,打开命名空间std

unique(iterator1,iterator2)的使用例子

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	vector<int>c2 = {9,1,9,8,6,2,4,3,2,3,5,7};
	sort(c2.begin(), c2.end());
	copy(c2.begin(),c2.end(),ostream_iterator<int>(cout," "));
	cout << endl;
	unique(c2.begin(),c2.end());
	copy(c2.begin(), c2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
//两次输出内容
// 1 2 2 3 3 4 5 6 7 8 9 9
// 1 2 3 4 5 6 7 8 9 8 9 9
}

我们会发现unique并非移除相邻的重复元素,而是用后面的元素去覆盖它

//正确的删除,重复元素
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	vector<int>c2 = {9,1,9,8,6,2,4,3,2,3,5,7};
	sort(c2.begin(), c2.end());
	copy(c2.begin(),c2.end(),ostream_iterator<int>(cout," "));
	cout << endl;
	c2.erase(unique(c2.begin(),c2.end()),c2.end());

	copy(c2.begin(), c2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
}

//两次输出内容
// 1 2 2 3 3 4 5 6 7 8 9 9
// 1 2 3 4 5 6 7 8 9 

unique(iterator1,iterator2,op)的使用例子

//删除后一元素比未移除前一元素小1的元素
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	vector<int>c2 = {1,2,2,4,5,6};
	sort(c2.begin(), c2.end());
	copy(c2.begin(),c2.end(),ostream_iterator<int>(cout," "));
	cout << endl;
	
	c2.erase(unique(c2.begin(), c2.end(),
	 [](int i, int j)->bool { return (j - i) == 1; }), c2.end());

	copy(c2.begin(), c2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
}
//两次输出结果
// 1 2 2 4 5 6
// 1 4 6

//注意!注意!!这里的前一元素并非原序列紧邻的前一元素,而是未被移除的前一元素

unique_copy(iterator1,iterator2,iterator3)的使用例子

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	vector<int>c2 = {1,2,2,4,5,6};
	sort(c2.begin(), c2.end());
	auto e=unique_copy(c2.begin(),c2.end(),c2.begin()); //将124566放入容器c2中
	c2.erase(e, c2.end());
	copy(c2.begin(), c2.end(), ostream_iterator<int>(cout, " "));//12456
	cout << endl;
}
//当第三参数为流迭代器时
int main()
{
	vector<int>c2 = {1,2,2,4,5,6};
	sort(c2.begin(), c2.end());
	unique_copy(c2.begin(),c2.end(), ostream_iterator<int>(cout, " ")); 
	//输出123456,但本质上c2内容为122456未被改变,而是将改变副本内容传入流迭代器	
}

顺带提一点:对于unique,容器list有它自己的成员函数,我们应该优先使用它。

原创文章 23 获赞 1 访问量 363

猜你喜欢

转载自blog.csdn.net/weixin_44806268/article/details/105639872
今日推荐