• STL中unique的使用


    作用

    unique函数可以删除有序数组中的重复元素,即去重(并不是真正的删除,后面会讲)

    定义在头文件<algorithm>中

    函数原型

    1.只有两个参数,且参数类型都是迭代器:

        iterator unique(iterator first,iterator last);

    这是最常用的形式,表示对区间[first,second)去重

    2.有三个参数,且前两个参数类型为迭代器,最后一个参数类型可以看作是bool类型:

      iterator unique(iterator first,iterator last,pred);

    与两个参数的主要区别是在第三个参数,其为自定义的“元素相等”函数,返回值为bool类型,根据这个函数定义的元素相等规则来去重

    其行为等价于这个函数

     1 template <class ForwardIterator>
     2   ForwardIterator unique (ForwardIterator first, ForwardIterator last)
     3 {
     4   if (first==last) return last;
     5 
     6   ForwardIterator result = first;
     7   while (++first != last)
     8   {
     9     if (!(*result == *first))  // or: if (!pred(*result,*first)) for version (2)
    10       *(++result)=*first;
    11   }
    12   return ++result;
    13 }

    从这个函数定义可以看出,首先要满足原数组有序,不是有序可能会出错,其次,去重的结果是非重复元素部分+原数组的后部分(与网上很多说讲相同分布移到数组后面还是有点不同)

    演示

    注意:unique有返回值,返回指向非重复部分的最后元素的下一个元素的迭代器,所以利用它可以删除多余部分,也可以求剩余部分的个数。(代码里有写)。

    //vector版

     1 #include<cstdio>
     2 #include<algorithm>        //std::unique
     3 #include<vector>
     4 using namespace std;
     5 
     6 const int maxn = 100000 + 10;
     7 int arr[maxn];
     8 
     9 int main()
    10 {
    11     int n;
    12     while (scanf("%d",&n) == 1 && n)
    13     {
    14         for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
    15         sort(arr, arr + n);
    16 
    17         vector<int>v(arr, arr + n);
    18         vector<int>::iterator it = unique(v.begin(), v.end());
    19 
    20         v.erase(it, v.end());    //这里就是把后面多出来的元素删除  [first,second)
    21 
    22         for (it = v.begin(); it != v.end(); it++)
    23             printf("%d ", *it);
    24         printf("
    ");
    25     }
    26     return 0;
    27 }

    //直接用数组

     1 #include<cstdio>
     2 #include<algorithm>        //std::unique
     3 #include<vector>
     4 using namespace std;
     5 
     6 const int maxn = 100000 + 10;
     7 int arr[maxn];
     8 
     9 int main()
    10 {
    11     int n;
    12     while (scanf("%d", &n) == 1 && n)
    13     {
    14         for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
    15         sort(arr, arr + n);
    16         int k = unique(arr, arr + n) - arr;
    17 
    18         for (int i = 0; i < k; i++)
    19             printf("%d ", arr[i]);
    20         printf("
    ");
    21     }
    22     return 0;
    23 }

    参考链接:

    1、https://blog.csdn.net/tomorrowtodie/article/details/51907471

    2、https://www.cnblogs.com/wangkundentisy/p/9033782.html

    3、http://www.cplusplus.com/reference/algorithm/unique/?kw=unique

  • 相关阅读:
    HDU1080(DP)
    hdu1059(多重背包优化)
    Codeforces Round #190 (Div. 2).D
    jQuery的安装
    JDBC-Statement,prepareStatement,CallableStatement的比较
    execute、executeQuery和executeUpdate之间的区别
    Word操作总结
    Excel 操作总结
    notepad 操作总结
    3.CSS使用基础(2)
  • 原文地址:https://www.cnblogs.com/lfri/p/9997999.html
Copyright © 2020-2023  润新知