展开菜单

unique函数

关于C++容器中的unique函数一个神奇发现

函数没有问题,是你的使用方法有问题。
end_unique = unique(v_int.begin(),v_int.end());
只是删除连续重复的值。记住是连续。
你想要的结果12345应该是
end_unique = unique(v_int.begin(),v_int.end());
end_unique = unique(v_int.begin(),end_unique, mod_equal);
先去掉连续重复的,再去掉相等的。

1、nique()函数是将重复的元素折叠缩编,使成唯一。

2、unqiue_copy()函数是将重复的元素折叠缩编,使成唯一,并复制到他处。这
两个函数的剔除字符原理是,看当前字符与他前一个字符是否相同,如果相同就剔除当前字符,如果不同就跳转到下一个字符。所以在求一个字符串的字符集的时候
要先把字符串排个序再调用上面两个函数剔除重复字符,获取字符集。

3、范例:

...

MATLAB中unique函数的时间复杂度

unique函数——取集合的单值元素 用法: b=unique(a),取集合a的不重复元素构成的向量。 b=unique(A,'rows'),返回A、B不同行元素组成的矩阵。 [b,i,j]=unique(。。。),i,j]体现b中元素在原向量(矩阵)中的位置。...

c++ unique函数

你定义的a函数的形参是1个对vector的引用,所以函数内对形参作的所有改动会影响到实参。
sort(words.begin(),words.end()) ; 首先是对形参容器进行排序,根据首字母。auto end_unique = unique(words.begin(),words.end()); 执行unique函数后,容器中重复元素被放到了最后面。(不知道你知不知道unique算法的作用,这是1个泛型算法,返回1个迭代器,他对传入的元素进行排序,同时把重复的元素放到最后面,返回的迭代器指向的重复的第1个元素),那这样实参的容器就发生变化了,10个元素顺序是这样的:。。。。。前面7个就懒得打了,turtle,the,turtle,此时的end_unique执行the,因为这是第1个重复的元素。a函数调用结束,打印vector里面的元素,现在vector已经拍过序了,有效的迭代器范围就是指向the,所以打印的时候只打印到这,最后的turtle因为不在迭代器范围内,所以不打印出来,懂了吗?一.unique函数类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素。
该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束。
// sort words alphabetically so we can find the duplicates
sort(words.begin(), words.end());
/* eliminate duplicate words:
* unique reorders words so that each word appears once in the
* front portion of words and returns an iterator one past the
unique range;
* erase uses a vector operation to remove the nonunique elements
*/
vector<string>::iterator end_unique = unique(words.begin(), words.end());
words.erase(end_unique, words.end());
在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。
若调用sort后,vector的对象的元素按次序排列如下:
sort jumps over quick red red slow the the turtle
注意,words的大小并没有改变,依然保存着10个元素;只是这些元素的顺序改变了。调用unique“删除”了相邻的重复值。给“删除”加上引号是因为unique实际上并没有删除任何元素,而是将无重复的元素复制到序列的前段,从而覆盖相邻的重复元素。unique返回的迭代器指向超出无重复的元素范围末端的下一个位置。
注意:算法不直接修改容器的大小。如果需要添加或删除元素,则必须使用容器操作。
example:
#include <iostream>
#include <cassert>
#include <algorithm>
#include <vector>
#include <string>
#include <iterator>
using namespace std;
int main()
{
//cout<<"Illustrating the generic unique algorithm."<<endl;
const int N=11;
int array1[N]={1,2,0,3,3,0,7,7,7,0,8};
vector<int> vector1;
for (int i=0;i<N;++i)
vector1.push_back(array1[i]);
vector<int>::iterator new_end;
new_end=unique(vector1.begin(),vector1.end()); //"删除"相邻的重复元素
assert(vector1.size()==N);
vector1.erase(new_end,vector1.end()); //删除(真正的删除)重复的元素
copy(vector1.begin(),vector1.end(),ostream_iterator<int>(cout," "));
cout<<endl;
return 0;
}

二、unique_copy函数
算法标准库定义了一个名为unique_copy的函数,其操作类似于unique。
唯一的区别在于:前者接受第三个迭代器实参,用于指定复制不重复元素的目标序列。
unique_copy根据字面意思就是去除重复元素再执行copy运算。
编写程序使用unique_copy将一个list对象中不重复的元素赋值到一个空的vector对象中。
//使用unique_copy算法
//将一个list对象中不重复的元素赋值到一个空的vector对象中
#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int ia[7] = {5 , 2 , 2 , 2 , 100 , 5 , 2};
list<int> ilst(ia , ia + 7);
vector<int> ivec;//将list对象ilst中不重复的元素复制到空的vector对象ivec中//sort(ilst.begin() , ilst.end()); //不能用此种排序,
ilst.sort(); //在进行复制之前要先排序
unique_copy(ilst.begin() , ilst.end() , back_inserter(ivec));
//输出vector容器
cout<<"vector: "<<endl;
for(vector<int>::iterator iter = ivec.begin() ; iter != ivec.end() ; ++iter)
cout<<*iter<<" ";
cout<<endl;
return 0;
}...

R语言中,unique和duplicate的区别是什么?

unique返回对象的不同取值,如“unique(c(1,1,2,3)) ”返回1 2 3

duplicated 判断对象的每个取值是否重复,如“duplicated(c(1,1,2,3)) ”返回 FALSE  TRUE FALSE FALSE ,其中T对应的为重复的值。

...

怎么区分一段文字中的unique字符和非unique字符

unique()函数是将重复的元素折叠缩编,使成唯一。
unqiue_copy()函数是将重复的元素折叠缩编,使成唯一,并复制到他处。这两个函数的剔除字符原理是,看当前字符与他前一个字符是否相同,如果相同就剔除当前字符,如果不同就跳转到下一个字符。所以在求一个字符串的字符集的时候要先把字符串排个序再调用上面两个函数剔除重复字符,获取字符集。
下面看一些代码比较
string str = "zhaohaoyang";
vector<char> vecch(str.begin(), str.end()); //根据迭代器的起始位置和终止位置来定初始化一个容器
vector<char>::iterator it = vecch.begin();
for (; it != vecch.end(); ++it){
cout<<*it;
}
cout<<endl; 输出:zhaohaoyang
unique(str.begin(), str.end());
cout<<str<<endl; //输出的还是原样:zhaohaoyang
unique()是剔除重复的没错,可是他是剔除相邻之间字符重复的,str中的字符前后之间是没有重复的,所以unique函数是起不到作用的。
假如把str换成"acttacct"执行上面的两句代码结果是:actactct,这个结果也是奇怪的。按照意愿应该是把多于的t与多于的c剔掉后只剩下actact了啊。最后两个字符ct是怎么回事呢?因为unique()函数并不是真的在源字符串上进行剔除的,原来的字符串经过unique()函数后虽然除掉了相邻之间重复的字符,可是字符串长度是不变的,也就是说所占内存大小没变。遇到这个问题通常会这么做str.erase(unique(str.begin(), str.end()), str.end());unique()函数的返回值是源字符串中去除相邻之间相同字符后剩下的字符串中的最后一个字符的下一个位置,举例说明:"acttacct"有8个字符,相邻之间重复的有两个,"acttacct"被unique()后的字符串面貌是"actactXX",X代表的是不确定的字符。unique函数的返回值是一个迭代器类型,指向的是第一个X所处的位置。STL中的参数区间都是左闭右开的,str.end()返回的迭代器指向第二个X位置的后面一个位置,所以调用str.erase()后就把后两个不确定的字符XX删除掉了。最后得到的就是我们最开始想要的结果了"actact"。...