STL 官網學習筆記—— unique

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, " "));
}

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章