1、unique,顧名思義,就是給容器內的連續的元素去重,這些連續重複的元素中只保留最前面的那一個
- 注意1:只有當遇到連續重複的元素,它纔會起到去重作用,如果是{1, 2, 1},則unique不能對其進行去重
- 注意2:unique操作不會減少容器的長度,它只是將保留下來的元素從頭一一覆蓋到容器中去,多出來的部分依舊是可以訪問的,這部分需要你自行去刪除
2、unique是穩定的,去重後,剩餘的元素順序是不變的
3、需要頭文件:algorithm
4、unique有兩個方法,一個是用默認的方式來定義重複元素,另一種是以自定義方式來判斷是否是重複元素
[first, last)表示容器中需要去重的範圍,返回值是一個前向指針,指向去重後的最後一個有效元素的下一個位置iter,你可以通過刪除
[iter, end) ,保留[first, iter),來達到去重效果
template <class ForwardIterator>
ForwardIterator unique(ForwardIterator first, ForwardIterator last);
以上這個方法,如果有連續的元素都滿足彼此相等,或者指向的對象相等,則爲重複元素
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique(ForwardIterator first, ForwardIterator last,
BinaryPredicate binary_pred);
以上這個方法,如果有連續的元素都滿足彼此相等,或者它們指向的對象在自定義的二元謂詞的作用下依舊爲true,binary_pred(*i, *(i-1)) == true,則爲重複元素
5、由於unique只能給連續的重複元素去重,採用 sort 與 unique 方法結合的方式,去重效果更佳
6、小示例
#include<iostream>
#include<iterator>
#include<algorithm>
#include<vector>
#include<list>
using namespace std;
inline bool eq_nocase(char c1, char c2) { return tolower(c1) == tolower(c2); }
inline bool lt_nocase(char c1, char c2) { return tolower(c1) < tolower(c2); }
int main()
{
// 運用默認方法來去重,直接去重可能達不到最佳效果
vector<int> V1;
V1.push_back(1);
V1.push_back(3);
V1.push_back(3);
V1.push_back(3);
V1.push_back(2);
V1.push_back(2);
V1.push_back(1);
vector<int>::iterator new_end1 = unique(V1.begin(), V1.end());
copy(V1.begin(), new_end1, ostream_iterator<int>(cout, " "));
cout<<endl;
cout << endl;
// 採用 排序 與 unique 方法結合的方式,去重效果更佳
const char init[] = "The Standard Template Library";
vector<char> V(init, init + sizeof(init));
// 調用sort進行排序
sort(V.begin(), V.end(), lt_nocase);
copy(V.begin(), V.end(), ostream_iterator<char>(cout));
cout << endl;
// 進行去重,運用自定義的方法來忽略大小寫問題
vector<char>::iterator new_end = unique(V.begin(), V.end(), eq_nocase);
copy(V.begin(), new_end, ostream_iterator<char>(cout));
cout << endl;
cout << endl;
// 去重成功,但後面的元素依舊還在
copy(V.begin(), V.end(), ostream_iterator<char>(cout));
cout << endl;
// 刪除它們
V.erase(new_end, V.end());
copy(V.begin(), V.end(), ostream_iterator<char>(cout));
cout << endl;
cout << endl;
// 補充:list.unique方法是可以減少容器長度的
int a[] = {1, 1, 4, 5, 5, 4, 5};
list<int> s(a, a + 7);
s.unique();
copy(s.begin(), s.end(), ostream_iterator<int>(cout, " "));
}
運行結果: