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
//注意!注意!!这里的前一元素并非原序列紧邻的前一元素,而是未被移除的前一元素
**op推荐采用lambdas表达式:lambdas的使用方法
**
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有它自己的成员函数,我们应该优先使用它。