C++ STL算法系列4---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:
#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=;
int array1[N]={,,,,,,,,,,};
vector<int> vector1;
for (int i=;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 ;
}
运行结果为:
aaarticlea/png;base64,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" alt="" />
二、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[] = { , , , , , , };
list<int> ilst(ia , ia + );
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 ;
}
假如
list<int> ilst(ia , ia + );
改为:vector<int> ilst(ia , ia + );
则排序时可用:
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算法系列4---unique , unique_copy函数的更多相关文章
- C++ STL算法系列1---unique , unique_copy函数
一.unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序 ...
- c++ STL unique , unique_copy函数
一.unique函数 类属性算法unique的作用是从输入序列中"删除"全部相邻的反复元素. 该算法删除相邻的反复元素.然后又一次排列输入范围内的元素,而且返回一个迭代器(容器的长 ...
- C++ STL算法系列 unique
类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值 ...
- C++ STL算法系列6---copy函数
现在我们来看看变易算法.所谓变易算法(Mutating algorithms)就是一组能够修改容器元素数据的模板函数,可进行序列数据的复制,变换等. 我们现在来看看第一个变易算法:元素复制算法copy ...
- C++ STL算法系列1---count函数
一.count函数 algorithm头文件定义了一个count的函数,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果. 编写程序读取一系列int型数据,并将 ...
- C++ STL算法系列2---find ,find_first_of , find_if , adjacent_find的使用
一.find运算 假设有一个int型的vector对象,名为vec,我们想知道其中是否包含某个特定值. 解决这个问题最简单的方法时使用标准库提供的find运算: 1 // value we'll lo ...
- C++ STL算法系列5---equal() , mismatch()
equal和mismatch算法的功能是比较容器中的两个区间内的元素.这两个算法各有3个参数first1,last1和first2.如果对 于区间[first1,last1)内所有的first1+i, ...
- C++ STL算法系列3---求和:accumulate
该算法在numeric头文件中定义. 假设vec是一个int型的vector对象,下面的代码: //sum the elements in vec starting the summation wit ...
- C++ STL算法之:copy
C++ STL算法:copy 目录(?)[+] 前面十二个算法所展现的都属于非变易算法(Non-mutating algorithms)系列,现在我们来看看变易算法.所谓变易算法(Mutating a ...
随机推荐
- 添加一个txt文件(例如在桌面),利用后台对文件写入内容
string str = "今天天气好晴朗,处处好风光."; //需要将字符串转化成字节数组 byte[] buffer = Encoding.Default.GetBytes(s ...
- 织梦DedeCMS调用二级子栏目或者多级栏目解决方法
本文是关于织梦DedeCMS调用多级子栏目的,拿来测试分享下.DEDECMS v5.7,后台已建栏目目录,如下图1所示: 图1 DEDECMS后台栏目结构 现在,我们先来调用顶级栏目"站长新 ...
- route工具
route工具 route工具主要用来查看或修改内核路由表. 1.查看内核路由表 route [-nee] 参数说明: -n:不要使用协议或主机名称,直接使用 IP 或 port number:-ee ...
- Egret命令行小结
1. build 构建指定项目,编译指定项目的TypeScript文件2. create 创建新项目3. create_app 从h5游戏生成app4. create_mainfest 在工程目录下生 ...
- Android文件保存和读取
public class DataActivity extends Activity { private EditText filenameText; private EditText content ...
- Js注册等待
<为维护网上公共秩序和社会稳定,请您自觉遵守以下条款: <br> <br> 一.不得利用本站危害国家安全.泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用 ...
- Serenity框架官方文档翻译3.2(多租户)
3.2多租户 在本教程中我们将把Norhwind变成一个多租户应用程序. 这是一个维基百科的多租户软件定义: 软件多租户是指一个软件架构的一个实例软件运行在一个服务器和多个租户.租户是一组共享一个公共 ...
- thinkphp 3.23 第三方登录sdk集成包
本集成包在官方包上扩展了支付宝登录和微信,支持最新的3.23版本 config /* URL配置 */ 'URL_CASE_INSENSITIVE' => true, //默认fa ...
- 关于angularjs 中自定义过滤器
包子认为,在angularjs中,经常需要用到自定义过滤器,来过滤相应的功能,自定义过滤器非常的简单,我就直接贴代码啦 其中input就是你需要进行操作的对象,,,用法就直接就是 是不是很easy.. ...
- Hadoop源码之Configuration
本文hadoop版本为最新版本2.6.Configuration做为Hadoop的一个基础功能承担着重要的责任,为Yarn.HSFS.MapReduce.NFS.调度器等提供参数的配置.配置文件的分布 ...