C++ 算法 中的 unique函数

首页 / C++入门教程 / C++ 算法 中的 unique函数

C++算法 unique()函数用于转换序列,以使每个重复的连续元素成为唯一元素。

第一个版本使用operator ==比较元素,第二个版本使用给定的二元谓词pred。

unique - 语法

equality (1)	template <class ForwardIterator>
                          ForwardIterator unique (ForwardIterator first, ForwardIterator last);

predicate (2)	template <class ForwardIterator, class BinaryPredicate>
                          ForwardIterator unique (ForwardIterator first, ForwardIterator last,
                          BinaryPredicate pred); 

unique - 参数

first:一个正向迭代器,指向要扫描以进行重复删除的参数内第一个元素的位置。

last:前向迭代器,指向要扫描的区域中距离最终元素一个位置的位置,以进行重复删除。

pred :用户定义的谓词函数对象,该对象定义了将参数中的两个元素视为等效时要满足的条件。二进制谓词返回两个参数,满足时返回true,不满足时返回false。 0

unique - 返回值

指向不包含连续重复项的参数的新末端的第一个正向迭代器。

链接:https://www.learnfk.comhttps://www.learnfk.com/c++/cpp-algorithm-unique-function.html

来源:LearnFk无涯教程网

unique - 例子1

让我们看一个简单的例子来演示unique()的用法:

无涯教程网

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cctype>

using namespace std;
 
int main() 
{
   //remove duplicate elements
    vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7};
    sort(v.begin(), v.end()); 
    auto last = unique(v.begin(), v.end());
   //v now holds {1 2 3 4 5 6 7 x x x x x x}, where 'x' is indeterminate
    v.erase(last, v.end()); 
    for (int i : v)
      cout << i << " ";
    cout << "\n";
    
    return 0;
}

输出:

1 2 3 4 5 6 7

unique - 例子2

让我们看另一个简单的例子:

#include <iostream>    //std::cout
#include <algorithm>   //std::unique, std::distance
#include <vector>      //std::vector

using namespace std;

bool myfunction (int i, int j) {
  return (i==j);
}

int main () {
  int myints[] = {10,20,20,20,30,30,20,20,10};          //10 20 20 20 30 30 20 20 10
  vector<int> myvector (myints,myints+9);

 //using default comparison:
  vector<int>::iterator it;
  it = unique (myvector.begin(), myvector.end());  //10 20 30 20 10 ?  ?  ?  ?
                                                        //               ^

  myvector.resize( distance(myvector.begin(),it) );//10 20 30 20 10

 //using predicate comparison:
  unique (myvector.begin(), myvector.end(), myfunction);  //(no changes)

 //print out content:
  std::cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << ' ' << *it;
  cout << '\n';

  return 0;
}

输出:

myvector contains: 10 20 30 20 10

unique - 例子3

让我们看另一个简单的例子:

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

void print(const char* tag, const vector<int>& v) {
  cout << tag << " : ";
  bool first = true;
  for (int x : v) {
    if (first) {
      first = false;
    }
    else {
      cout << ',';
    }
    cout << x;
  }
  cout << endl;
}

int main() {

  {
    vector<int> v = { 2,5,3,3,1,2,4,2,1,1,4,4,3,3,3 };

    decltype(v)::iterator result = unique(v.begin(), v.end());

    v.erase(result, v.end());

    print("unsorted unique", v);
  }

  {
      vector<int> v = { 2,5,3,3,1,2,4,2,1,1,4,4,3,3,3 };

    sort(v.begin(), v.end());
    decltype(v)::iterator result = unique(v.begin(), v.end());

    v.erase(result, v.end());

    print("sorted unique", v);
  }
}

输出:

unsorted unique : 2,5,3,1,2,4,2,1,4,3
sorted unique : 1,2,3,4,5

unique - 例子4

让我们看另一个简单的例子:

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cctype>

using namespace std;

int main() 
{
   //remove duplicate elements (normal use)
    vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7};
    sort(v.begin(), v.end());//1 1 2 2 3 3 3 4 4 5 5 6 7 
    auto last = unique(v.begin(), v.end());
   //v now holds {1 2 3 4 5 6 7 x x x x x x}, where 'x' is indeterminate
    v.erase(last, v.end()); 
    for (int i : v)
      cout << i << " ";
    cout << "\n";
 
   //remove consecutive spaces
    string s = "wanna go    to      space?";
    auto end = unique(s.begin(), s.end(), [](char l, char r){
        return isspace(l) && isspace(r) && l == r;
    });
   //s now holds "wanna go to space?xxxxxxxx", where 'x' is indeterminate
    cout << string(s.begin(), end) << '\n';
}

输出:

1 2 3 4 5 6 7 
wanna go to space?

unique - 例子5

让我们看另一个例子:

#include <vector>  
#include <algorithm>  
#include <functional>  
#include <iostream>  
#include <ostream>  
  
using namespace std;  
  
// Return whether modulus of elem1 is equal to modulus of elem2  
bool mod_equal ( int elem1, int elem2 )  
{  
   if ( elem1 < 0 )   
      elem1 = - elem1;  
   if ( elem2 < 0 )   
      elem2 = - elem2;  
   return elem1 == elem2;  
};  
  
int main( )  
{  
   vector <int> v1;  
   vector <int>::iterator v1_Iter1, v1_Iter2, v1_Iter3,  
         v1_NewEnd1, v1_NewEnd2, v1_NewEnd3;  
  
   int i;  
   for ( i = 0 ; i <= 3 ; i++ )  
   {  
      v1.push_back( 5 );  
      v1.push_back( -5 );  
   }  
  
   int ii;  
   for ( ii = 0 ; ii <= 3 ; ii++ )  
   {  
      v1.push_back( 4 );  
   }  
   v1.push_back( 7 );  
  
   cout << "Vector v1 is ( " ;  
   for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1.end( ) ; v1_Iter1++ )  
      cout << *v1_Iter1 << " ";  
   cout << ")." << endl;  
  
  //Remove consecutive duplicates  
   v1_NewEnd1 = unique ( v1.begin ( ) , v1.end ( ) );  
  
   cout << "Removing adjacent duplicates from vector v1 gives\n ( " ;  
   for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1_NewEnd1 ; v1_Iter1++ )  
      cout << *v1_Iter1 << " ";  
   cout << ")." << endl;  
  
  //Remove consecutive duplicates under the binary prediate mod_equals  
   v1_NewEnd2 = unique ( v1.begin ( ) , v1_NewEnd1 , mod_equal );  
  
   cout << "Removing adjacent duplicates from vector v1 under the\n "  
        << " binary predicate mod_equal gives\n ( " ;  
   for ( v1_Iter2 = v1.begin( ) ; v1_Iter2 != v1_NewEnd2 ; v1_Iter2++ )  
      cout << *v1_Iter2 << " ";  
   cout << ")." << endl;  
  
  //Remove elements if preceded by an element that was greater  
   v1_NewEnd3 = unique ( v1.begin ( ) , v1_NewEnd2, greater<int>( ) );  
  
   cout << "Removing adjacent elements satisfying the binary\n "  
        << " predicate mod_equal from vector v1 gives ( " ;  
   for ( v1_Iter3 = v1.begin( ) ; v1_Iter3 != v1_NewEnd3 ; v1_Iter3++ )  
      cout << *v1_Iter3 << " ";  
   cout << ")." << endl;  
   
   return 0;
}

输出:

Vector v1 is ( 5 -5 5 -5 5 -5 5 -5 4 4 4 4 7 ).
Removing adjacent duplicates from vector v1 gives
 ( 5 -5 5 -5 5 -5 5 -5 4 7 ).
Removing adjacent duplicates from vector v1 under the
  binary predicate mod_equal gives
 ( 5 4 7 ).
Removing adjacent elements satisfying the binary
  predicate mod_equal from vector v1 gives ( 5 7 ).

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入拆解Java虚拟机 -〔郑雨迪〕

Kafka核心技术与实战 -〔胡夕〕

物联网开发实战 -〔郭朝斌〕

Python自动化办公实战课 -〔尹会生〕

操作系统实战45讲 -〔彭东〕

容量保障核心技术与实战 -〔吴骏龙〕

说透5G -〔杨四昌〕

编程高手必学的内存知识 -〔海纳〕

中间件核心技术与实战 -〔丁威〕

好记忆不如烂笔头。留下您的足迹吧 :)