c++ STL unique , unique_copy函数
一.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
则调用unique后,vector中存储的内容是:
注意,words的大小并没有改变,依旧保存着10个元素;仅仅是这些元素的顺序改变了。调用unique“删除”了相邻的反复值。给“删除”加上引號是由于unique实际上并没有删除不论什么元素,而是将无反复的元素拷贝到序列的前段。从而覆盖相邻的反复元素。unique返回的迭代器指向超出无反复的元素范围末端的下一个位置。
注意:算法不直接改动容器的大小。假设须要加入或删除元素。则必须使用容器操作。
example:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
#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;
}
假如
list<int> ilst(ia , ia + 7);
改为:vector<int> ilst(ia , ia + 7);
则排序时可用:
sort(ilst.begin() , ilst.end());
这里要注意list和vector的排序用什么方法。
《Effective STL》里这些话可能实用处:
item 31
“我们总结一下你的排序选择:
● 假设你须要在vector、string、deque或数组上进行全然排序。你能够使用sort或stable_sort。
● 假设你有一个vector、string、deque或数组,你仅仅须要排序前n个元素,应该用partial_sort。
● 假设你有一个vector、string、deque或数组。你须要鉴别出第n个元素或你须要鉴别出最前的n个元素,而不用知道它们的顺序,nth_element是你应该注意和调用的。
● 假设你须要把标准序列容器的元素或数组分隔为满足和不满足某个标准,你大概就要找partition或stable_partition。 ● 假设你的数据是在list中,你能够直接使用partition和stable_partition,你能够使用list的sort来取代sort和stable_sort。 假设你须要partial_sort或nth_element提供的效果,你就必须间接完毕这个任务,但正如我在上面勾画的。会有非常多选择。
另外,你能够通过把数据放在标准关联容器中的方法以保持在不论什么时候东西都有序。你也可能会考虑标准非STL容器priority_queue,它也能够总是保持它的元素有序。
c++ STL unique , unique_copy函数的更多相关文章
- C++ STL算法系列4---unique , unique_copy函数
一.unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序 ...
- C++ STL算法系列1---unique , unique_copy函数
一.unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序 ...
- STL区间成员函数及区间算法总结
STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间 ...
- unique() 去重函数
unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个), 还有一个容易忽视的特性是它并不真正把重复的元素删除.他是c++中的函数, 所以头 ...
- STL中一些函数的应用
1.nth_element():找到第几大的数.用法:nth_element(a,a+k,a+n),返回一个数组a中第k大的数,时间复杂度比较小,头文件#include <algorithm&g ...
- 西安电子科技大学第16届程序设计竞赛 F Operating System (unique() 去重函数)
链接:https://www.nowcoder.com/acm/contest/107/F来源:牛客网 Operating System 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...
- STL之list函数解析
STL之list函数解析 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入删除元素. 使用 ...
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
- 使用STL库sort函数对vector进行排序
使用STL库sort函数对vector进行排序,vector的内容为对象的指针,而不是对象. 代码如下 #include <stdio.h> #include <vector> ...
随机推荐
- HDU 2181 DFS
Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每一个城市刚好一次后回到出发的城市. Input 前20行的第i行有3 ...
- POJ1390 Blocks 【动态规划】
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4173 Accepted: 1661 Descriptio ...
- UVA 11728 - Alternate Task 数学
Little Hasan loves to play number games with his friends. One day they were playing a game whereone ...
- redis 五大数据类型的常用指令
STRING 192.168.1.66:6379> get k1 "v1" 192.168.1.66:6379> append k1 12345 (integer) 7 ...
- caffe训练CIFAR数据库
CIFAR-10是一个用于普适物体识别的数据集.Cifar-10由60000张32*32的RGB彩色图片构成,50000张训练图片,10000张测试图片,分为10类.cifar下载地址: http:/ ...
- webrtc所有平台下载编译步骤详细说明
webrtc所有平台下载编译步骤详细说明 1.安装depot tools Windows:国外下载:https://storage.googleapis.com/chrome-infra/depot_ ...
- JPA实现一对多(OneToMany)关联
转自:https://blog.csdn.net/qq_32444825/article/details/77084580 1.考试类 @Entity public classExam impleme ...
- CSS中alt和title属性的正确使用
1.在<img>标签中的使用 alt:全称为alttext,实质是当图片无法正确显示时用于替换(在IE下同时起到了title的作用,即鼠标滑过时文字提示): title:鼠标经过时文字提示 ...
- UIimageView和UIimage的小区别
UIimageView 用来显示一张图片或者显示一组动画图片 UIimage 不是一个控件,只是一个普通的类,用来生成一张图片,只单纯的生成一张图片,图片只会被加载到内存,如果想要让用户 ...
- Git+VS2015修改提交代码以及解决冲突
第一步:前提我们已经讲代码从git上clone(可以看我的GIt篇)下来,创建自己的开发分支.我们在自己本地的分支上开发. 看到右下角有一个develop那是我自己建立的开发的分支,现在点击devel ...