-
2022-06-14 11:41:12
unique函数是C++STL容器中一个非常实用的函数,它可以用来对数组进行去重,非常的实用,我们通常把它用在sort()函数排序之后,它可以返回这个数列的最后一个
#include <bits/stdc++.h> using namespace std; int main() { int a[10]={1,1,1,2,2,3,8,7,8,9}; sort(a,a+10); for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; int cnt=unique(a,a+10)-a; cout<<cnt<<endl; for(int i=0;i<cnt;i++) cout<<a[i]<<" "; return 0; }
"unique"是C++语言中的STL函数,包含于<algorithm>头文件中。功能是将数组中相邻的重复元素去除。然而其本质是将重复的元素移动到数组的末尾,最后再将迭代器末尾指向最后不重复的下标。
所以要先让容器变成有序的才可以。
用法:unique(数组名,数组名+长度),类似于sort(a,a+n)这样的操作。
时间复杂度单从unique来说是O(n),但是再加上之前的排序,就变成了O(nlogn);
unique() 函数一般是用来作为去重的函数的,例如:
vector alls;//存储所有数的值;
sort(alls.begin(),alls.end());//将所有的值排序
alls.erase(unique(alls.begin(),alls.end()),alls.end()); //去重;
原文链接:https://blog.csdn.net/ftyykil/article/details/117386173更多相关内容 -
C++中unique函数的用法示例
2020-12-31 20:43:23unique是STL比较实用的一个函数。用于“去除”容器内相邻的重复的元素(只保留一个)。这里说的去除并不是真正将容器内的重复元素删去,只是把重复的元素移到容器最后,但是依然在容器内。 对于数组而言返回去重后... -
【Unique函数】Unique函数用法
2019-07-31 11:57:41unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它...unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。
二.函数原型
unique函数的函数原型如下:
1.只有两个参数,且参数类型都是迭代器:
iterator unique(iterator it_1,iterator it_2);
这种类型的unique函数是我们最常用的形式。其中这两个参数表示对容器中[it_1,it_2)范围的元素进行去重(注:区间是前闭后开,即不包含it_2所指的元素),返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。
2.有三个参数,且前两个参数类型为迭代器,最后一个参数类型可以看作是bool类型:
iterator unique(iterator it_1,iterator it_2,bool MyFunc);
该类型的unique函数我们使用的比较少,其中前两个参数和返回值同上面类型的unique函数是一样的,主要区别在于第三个参数。这里的第三个参数表示的是自定义元素是否相等。也就是说通过自定义两个元素相等的规则,来对容器中元素进行去重。这里的第三个参数与STL中sort函数的第三个参数功能类似(关于sort函数:http://www.cnblogs.com/wangkundentisy/p/8982180.html)。关于第三个参数的详细介绍,可以参考:http://www.cplusplus.com/reference/algorithm/unique/
三.函数用法实例
上面介绍了unique函数的功能和原型,那么,它到底是如何进行去重的呢?即“删除”的具体操作是怎样的呢?
关于这个问题,http://www.cplusplus.com/reference/algorithm/unique/给了我们一种解释,即unique函数是完全等价于下面这个函数的:
iterator My_Unique (iterator first, iterator last) { if (first==last) return last;
iterator result = first;
while (++first != last)
{
if (!(*result == *first))
*(++result)=*first;
}
return ++result;
}
分析这段代码,我们可以知道,unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。有了这段代码我们可以结合实例来更好的理解这个函数了。
实例:
#include<iostream>
#include<algorithm>
#include<cassert>using namespace std; static bool myfunc(int i, int j) { return (i + 1) == j; //return i == j; }
int main(){
vector<int> a = {1,3,3,4,5,6,6,7};
vector<int>::iterator it_1 = a.begin();
vector<int>::iterator it_2 = a.end();//sort(it_1,it_2);
cout<<"去重前的 a : ";
for(int i = 0 ; i < a.size(); i++)
cout<<a[i];
cout<<endl;
//it_h = unique(it_1,it_2);
//unique(it_1,it_2,myfunc);
unique(it_1,it_2);
cout<<"去重后的 a : ";
for(int i = 0 ; i < a.size(); i++)
cout<<a[i];
cout<<endl;
}
运行结果如下:
对于上面的结果,我们可以看到,容器中不重复的元素都移到了前面,至于后面的元素,实际上并没有改变(这个过程只需结合My_Unique函数来分析即可)。
注:
1.有很多文章说的是,unique去重的过程是将重复的元素移到容器的后面去,实际上这种说法并不正确,应该是把不重复的元素移到前面来。
2.一定不要忘记的是,unique函数在使用前需要对容器中的元素进行排序(当然不是必须的,但我们绝大数情况下需要这么做),由于本例中的元素已经是排好序的,所以此处我没排序,但实际使用中不要忘记。
四.用法拓展
1.我们以上的实例针对的是函数原型1的用法,对于函数原型2,我们仍然使用上述实例,只不过unique的用法变成:
unique(it_1,it_2,myfunc);
即自定义的元素相等的准则,其中myfunc在上述实例中有其源码,分析可知,只有i+1 == j的时候我们才认为i和j“相等”;实例结果如下:
也就是说,按照我们自定义的规则,这个实例中只有3和4”相等的”,4和5是”相等的”,5和6,6和7是”相等的”。所以最终结果是上图的样子。
2.unique函数通常和erase函数一起使用,来达到删除重复元素的目的。(注:此处的删除是真正的删除,即从容器中去除重复的元素,容器的长度也发生了变换;而单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化)关于erase函数的用法,可以参考:http://www.cnblogs.com/wangkundentisy/p/9023977.html。下面是一个具体的实例:
#include<iostream> #include<algorithm> #include<cassert> using namespace std;
int main()
{vector<int> a ={1,3,3,4,5,6,6,7};
vector<int>::iterator it_1 = a.begin();
vector<int>::iterator it_2 = a.end();
vector<int>::iterator new_end;new_end = unique(it_1,it_2); //注意unique的返回值
a.erase(new_end,it_2);
cout<<"删除重复元素后的 a : ";
for(int i = 0 ; i < a.size(); i++)
cout<<a[i];
cout<<endl;}
运行结果如下:
可以看到,相比之前的结果,a的长度确实发生了改变,真正的删除了a中的重复元素。
-
STL函数——unique函数
2021-09-03 21:53:13unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它...一、函数定义
unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。
二.函数原型
unique函数的函数原型如下:
1.只有两个参数,且参数类型都是迭代器:
1
iterator unique(iterator it_1,iterator it_2);
这种类型的unique函数是我们最常用的形式。其中这两个参数表示对容器中[it_1,it_2)范围的元素进行去重(注:区间是前闭后开,即不包含it_2所指的元素),返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。
2.有三个参数,且前两个参数类型为迭代器,最后一个参数类型可以看作是bool类型:
1
iterator unique(iterator it_1,iterator it_2,
bool
MyFunc);
该类型的unique函数我们使用的比较少,其中前两个参数和返回值同上面类型的unique函数是一样的,主要区别在于第三个参数。这里的第三个参数表示的是自定义元素是否相等。也就是说通过自定义两个元素相等的规则,来对容器中元素进行去重。这里的第三个参数与STL中sort函数的第三个参数功能类似(关于sort函数:http://www.cnblogs.com/wangkundentisy/p/8982180.html)。关于第三个参数的详细介绍,可以参考:http://www.cplusplus.com/reference/algorithm/unique/
三.函数用法实例
上面介绍了unique函数的功能和原型,那么,它到底是如何进行去重的呢?即“删除”的具体操作是怎样的呢?
关于这个问题,http://www.cplusplus.com/reference/algorithm/unique/给了我们一种解释,即unique函数是完全等价于下面这个函数的:
1
2
3
4
5
6
7
8
9
10
11
12
iterator My_Unique (iterator first, iterator last)
{
if
(first==last)
return
last;
iterator result = first;
while
(++first != last)
{
if
(!(*result == *first))
*(++result)=*first;
}
return
++result;
}
分析这段代码,我们可以知道,unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。有了这段代码我们可以结合实例来更好的理解这个函数了。
实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
#include<algorithm>
#include<cassert>
using
namespace
std;
static
bool
myfunc(
int
i,
int
j)
{
return
(i + 1) == j;
//return i == j;
}
int
main()
{
vector<
int
> a = {1,3,3,4,5,6,6,7};
vector<
int
>::iterator it_1 = a.begin();
vector<
int
>::iterator it_2 = a.end();
//sort(it_1,it_2);
cout<<
"去重前的 a : "
;
for
(
int
i = 0 ; i < a.size(); i++)
cout<<a[i];
cout<<endl;
//it_h = unique(it_1,it_2);
//unique(it_1,it_2,myfunc);
unique(it_1,it_2);
cout<<
"去重后的 a : "
;
for
(
int
i = 0 ; i < a.size(); i++)
cout<<a[i];
cout<<endl;
}
运行结果如下:
对于上面的结果,我们可以看到,容器中不重复的元素都移到了前面,至于后面的元素,实际上并没有改变(这个过程只需结合My_Unique函数来分析即可)。
注:
1.有很多文章说的是,unique去重的过程是将重复的元素移到容器的后面去,实际上这种说法并不正确,应该是把不重复的元素移到前面来。
2.一定不要忘记的是,unique函数在使用前需要对容器中的元素进行排序(当然不是必须的,但我们绝大数情况下需要这么做),由于本例中的元素已经是排好序的,所以此处我没排序,但实际使用中不要忘记。
四.用法拓展
1.我们以上的实例针对的是函数原型1的用法,对于函数原型2,我们仍然使用上述实例,只不过unique的用法变成:
1
unique(it_1,it_2,myfunc);
即自定义的元素相等的准则,其中myfunc在上述实例中有其源码,分析可知,只有i+1 == j的时候我们才认为i和j“相等”;实例结果如下:
也就是说,按照我们自定义的规则,这个实例中只有3和4”相等的”,4和5是”相等的”,5和6,6和7是”相等的”。所以最终结果是上图的样子。
2.unique函数通常和erase函数一起使用,来达到删除重复元素的目的。(注:此处的删除是真正的删除,即从容器中去除重复的元素,容器的长度也发生了变换;而单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化)关于erase函数的用法,可以参考:http://www.cnblogs.com/wangkundentisy/p/9023977.html。下面是一个具体的实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<algorithm>
#include<cassert>
using
namespace
std;
int
main()
{
vector<
int
> a ={1,3,3,4,5,6,6,7};
vector<
int
>::iterator it_1 = a.begin();
vector<
int
>::iterator it_2 = a.end();
vector<
int
>::iterator new_end;
new_end = unique(it_1,it_2);
//注意unique的返回值
a.erase(new_end,it_2);
cout<<
"删除重复元素后的 a : "
;
for
(
int
i = 0 ; i < a.size(); i++)
cout<<a[i];
cout<<endl;
}
运行结果如下:
可以看到,相比之前的结果,a的长度确实发生了改变,真正的删除了a中的重复元素。
-
unique函数详解
2022-03-02 15:48:27unique函数是去除相邻的相同的元素,最后返回的是结尾的指针。 例子: 这三个1都是相邻的,故删除后只有一个1。 例子: 这里是没变的,因为相同的1并未相邻。unique函数是去除相邻的相同的元素,最后返回的是结尾的指针。
例子:
这三个1都是相邻的,故删除后只有一个1。
例子:
这里是没变的,因为相同的1并未相邻。 -
关于unique函数
2021-11-23 16:08:10torch和numpy中都有unique函数,作用是去除张量/向量组中的重复张量/向量。 torch torch.unique(input, sorted=True, return_inverse=False, return_counts=False, dim=None) 可以看到有 return_inverse和... -
matlab unique函数
2021-03-25 20:30:01格式b = unique (a)%取集合a的不重复元素构成的向量 b = unique (A,'rows')%返回A、B不同行元素组成的矩阵 [b,i,j] = unique (…)%i体现b中元素在原向量(矩阵a)中的位置;j体现原向量(矩阵a)在b中的位置 例1-39 ... -
unique函数用法
2021-05-06 10:47:30unique函数用法 unique包含在头文件 #include <algorithm> 函数作用:“去除”容器或数组中相邻元素之间重复出现的元素 unique函数的三个参数: 1、想要去重的数据集的起始地址 2、想要去重的最后一个元素的... -
unique函数
2019-01-25 16:13:58在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,... -
numpy_unique函数
2021-12-31 17:21:55numpy的unique函数用于输出数组中不同的值。 import numpy as np a = np.unique([1, 1, 2, 2, 3, 3]) b = np.array([[1, 1], [2, 3]]) b = np.unique(b) print("a =", a) print("b =", b) 执行结果: a = [1 2... -
c++中unique函数
2021-11-07 15:10:381、使用需要引入#include<algorithm> 2、作用:去除容器中相邻重复元素,但是这是一个伪去重,它会把重复的元素... //因为unique函数返回值为第一个重复元素的下标,因而清除该返回地址到容器结尾中的元素即可。 -
unique 函数 详解
2019-02-17 21:03:58unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它... -
matlab中的unique函数详解
2021-04-22 19:37:22C = unique(A):返回的是和A中一样的值,但是没有重复元素。产生的结果向量按升序排序。示例:1.筛除向量中的重复值,产生的结果按升序排列Define a vector with a repeated value.A = [9 2 9 5];Find the unique ... -
STL中的unique函数
2021-09-16 10:21:40unique是STL中一个比较实用而且非常常用的函数之一了; 作用就是容器或数组去重,但是并不是完全的去重;它只是把重复的元素放在了容器的后面,而且去重前一定要先排序; 头文件:#include<algorithm> 特点: ... -
C++ Unique函数 详细
2019-05-14 12:07:45unique函数是STL中比较实用的函数之一 包含该函数的函数头文件为 #include <algorithm> 2 unique函数可以删除有序数组中的重复元素。 注意: a 这里的删除不是真的delete,而是将重复的元素放到容器末尾 b ... -
matlab中的unique函数(数组中的唯一值)
2021-01-12 16:48:20matlab中的unique函数(数组中的唯一值) 常用的几个unique函数如下: C = unique(A); [C, ia, ic] = unique(A); [C,ia,ic] = unique(A,‘rows’); [C,ia,ic] = unique(A(:,1:2),‘rows’); 如果 A 是向量,则 C ... -
STL的unique函数返回值
2020-06-25 13:05:07unique:使具有连续相同值的对象只留一份,由s与e迭代器来指定处理范围,并返回压缩后的序列末尾的迭代器 #include<iostream> #include<algorithm> #include<vector> using namespace std; int ... -
unique函数基础讲解
2020-08-28 20:34:15unique函数的参数是迭代器,也可以在数组中实现,本质还是类似迭代器。 一般用法: sort(a,a+n);//先排序 unique(a,a+n); 或者 unique(a.begin(),a.end()); 实现了除重操作,把不重复的数排在了前面,重复的数排在了... -
Python numpy.unique函数方法的使用
2020-12-21 05:09:10numpy.uniquenumpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None) [source]查找数组的唯一(unique)元素。返回数组的排序后的唯一元素。 除独特元素外,还有三个可选输出:... -
python | pandas:unique函数
2021-11-30 16:19:05作用:unique()函数用于获取Series对象的唯一值。 唯一性按出现顺序返回。基于哈希表的唯一,因此不排序 语法:Series.unique(self) 返回:ndarray 或 ExtensionArray作为 NumPy 数组返回的唯一值。 注意:以 ... -
c++ unique函数详解
2019-07-10 15:42:10unique是 c++标准模板库STL中十分实用的函数之一,使用此函数需要#include <algorithm>头文件 该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素 (1) 这里的去除并非真正意义的erase,而是将... -
Python pandas.DataFrame.nunique函数方法的使用
2021-07-16 09:12:01Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的...原文地址:Python pandas.DataFrame.nunique函数方法的使用 ... -
C++中unique函数的使用。
2020-06-03 13:01:48C++中uniqueuniqueunique函数的使用。 对数组中相邻的重复元素实现“去重"。 一般都是对排好序的数组"去重". 这里的去重是指将不重复的元素...若数组从0开始则不重复序列的大小为unique(a,a+sizetot)−aunique(a,a+size -
R语言unique函数计算数据对象(vector、dataframe)的unique独特值:unique函数从vector向量、dataframe中...
2021-11-27 17:38:00R语言unique函数计算数据对象(vector、dataframe)的unique独特值:unique函数从vector向量、dataframe中删除重复项、删除dataframe重复行 -
Python中numpy库的unique函数
2020-11-01 00:14:51unique函数 对于一维数组(元组)或列表,unique函数去除其中重复的元素,并按元素由小到大的顺序返回一个新的无重复元素列表 import numpy as np A = [1, 2, 2, 5, 3, 4, 4] #列表 a = np.unique(A) B = (1, 2, 2,...