去重函数unique,sort,erase的应用
std::unique
一.总述
unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不
是真的删除,而是指重复元素的位置被不重复的元素给占领了。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都
会将目标序列进行排序。
功能:对有序的容器重新排列,将第一次出现的元素从前往后排,其他重复出现的元素依次排在后面
二.函数原型
unique函数的函数原型如下:1.只有两个参数,且参数类型都是迭代器:
iterator unique(iterator it_1,iterator it_2);
这种类型的unique函数是我们最常用的形式。其中这两个参数表示对容器中[it_1,it_2)范围的元素进行去重(注:区间是前闭后开,即不包含it_2所指的元素),返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。
有序的容器:
| 1 | 1 | 2 | 3 | 3 | 4 | 4 | 4 | 5 | 6 |
unique处理过的容器:
| unique | unique | unique | unique | unique | unique | 迭代器指向的地址 | |||
| 1 | 2 | 3 | 4 | 5 | 6 | 1 | 3 | 4 | 4 |
三、去重函数unique
头文件:#include <algorithm>
unique的作用就是"去除"数组中重复的元素,unique去重的过程是将重复的元素移到容器的后面去,实际上这种说法并不正确,应该是把不重复的元素移到前面来:
-
#include <iostream>
-
#include <algorithm>
-
-
using namespace std;
-
-
int main()
-
{
-
int a[10] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
-
-
int n = unique(a, a + 10) - a;
-
-
cout << n << endl; //7,得到不重复元素的个数;
-
-
for (int i = 0; i < 10; i++)
-
cout << a[i] << " "; //0 7 6 1 5 8 9 5 8 9
-
-
return 0;
-
}
可以看见最后三个元素是:5 8 9,而重复的数字是1 5 7,所以网上这种说法:“unique去重的过程是将重复的元素移到容器的后面去”是不对的。
上面的n返回的是7,它就是:最后一个不重复数字的下标。
所以,把上面的for循环改成:
-
for (int i = 0; i < n; i++)
-
cout << a[i] << " "; //0 7 6 1 5 8 9
让i < n就是只输出前面不重复的数字,这样就实现的去重的效果。
四、去重函数unique与排序函数sort结合
如果先去重再排序那么结果就是:去重毫无作用。因为去重再排序排序时会把重复的数字又放在了一起,所以要先排序再去重。这点应该好理解,这里就提一下。
先排序再去重代码如下:
-
#include <iostream>
-
#include <algorithm> //sort(), unique()
-
#include <functional> //less<int>()
-
-
using namespace std;
-
-
int main()
-
{
-
int i;
-
int a[10] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
-
-
sort( a, a + 10, less<int>() ); //排序
-
-
int n = unique(a, a + 10) - a; //去重
-
-
for ( i = 0; i < n; i++) //注意i < n
-
cout << a[i] << " "; //0 1 5 6 7 8 9
-
}
于是就得到了想要的结果:先把数字排序,再去掉重复数字。
五,以上便是去重应用于数组的情况:接下来看一下字符串的情况:
uniqe()函数是去掉重复的字符。是指两个字符连续出现就只留下一个,其余的就删除。例如:
string s("hello,world");
string::iterator iterEnd=unique(s.begin(),s.end()); //返回出现重复元素的迭代器位置
这代码执行后,s的值为helo,worldd. 只消除连续出现的同样的字符。重点是不连续的不消除。
unique函数通常和erase函数一起使用,来达到删除重复元素的目的。(注:此处的删除是真正的删除,即从容器中去除重复的元素,容器
的长度也发生了变换;而单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化)
还有一个就是unqiue()函数删除重复的字符后,字符串长度不变,所以如果字符串删除字符后,后面按照之前的值填上。 所以就是helo,worldd,而不是helo,world;
所以就会有一个函数erase()函数存在的必要性了。它可以删除字符。
s.erase(iterEnd,s.end()); //删除掉重复元素;
执行后s的值就是我们想要的helo,world.
如果想要只留下一个字符l,只能先排序!!!!让他们挨在一块。
sort()函数是排序字符串字符。 即如果是akjsc,排序后为acjks.
所以一般用unique函数的时候都会用到erase(). sort()用到也也比较多。
六,总结:
-
#include <iostream>
-
#include <algorithm> //sort(), unique()
-
#include <functional> //less<int>()
-
#include<string>
-
using namespace std;
-
-
int main()
-
{
-
/////////////////字符串的去重排序
-
string str = "sjscncmkzmxkz";
-
-
sort(str.begin(), str.end()); //先对字符串排序;
-
-
string::iterator itend = unique(str.begin(), str.end()); //返回出现重复元素的首地址;
-
-
cout << str << endl;
-
-
str.erase(itend, str.end()); //删除重复元素;
-
-
cout << str << endl;
-
-
////////////数组的去重排序;
-
int a[10] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
-
-
sort(a, a + 10, less<int>()); //排序
-
-
int n = unique(a, a + 10) - a; //去重
-
int n1 = distance(a, unique(a, a + n)); //获得不重复元素的个数;
-
-
for (int i = 0; i < n1; i++) //注意i < n
-
cout << a[i] << " "; //0 1 5 6 7 8 9
-
}
去重函数unique,sort,erase的应用的更多相关文章
- STL中去重函数unique
一:unique(a.begin(),a.end());去重函数只是去掉连续的重复值,对于不连续的值没有影响,SO,在使用前一般需要进行排序处理: 二: vector<int>::ite ...
- 西安电子科技大学第16届程序设计竞赛 F Operating System (unique() 去重函数)
链接:https://www.nowcoder.com/acm/contest/107/F来源:牛客网 Operating System 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...
- unique() 去重函数
unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个), 还有一个容易忽视的特性是它并不真正把重复的元素删除.他是c++中的函数, 所以头 ...
- unique(去重函数)
去重排序(unique函数的使用) 2013年05月30日 11:05:45 阅读数:9689更多 个人分类: 字符串处理 出处:http://www.cnblogs.com/QQbai/archi ...
- HDU1412-{A} + {B},通过率并不高,但同样是用一个很简洁的函数unique,超短代码水过~
{A} + {B} Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) http: ...
- Linux 文本去重 之 命令sort 与 uniq
sort [-fbMnrtuk] [file or stdin] 选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同: -b :忽略最前面的空格符部分: -M :以月份的名字来排序 ...
- jquery 里面对数组去重操作-unique
js: var yearArray = new Array(2009, 2009, 2010, 2010, 2009, 2010); $.unique(yearArray); alert(yearAr ...
- qsort函数、sort函数【转】
http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...
- php中的常用数组函数(八) 排序函数汇总(sort、rsort、usort、asort、uasort、arsort、ksort、uksort、krsort、natsort、natcasesort、array_multisort)
测试环境:php5.3.29 sort_flags 可以用以下值改变排序的行为: 排序类型标记: SORT_REGULAR - 正常比较单元(不改变类型) SORT_NUMERIC - 单元被作为数字 ...
随机推荐
- Error: Can't find Python executable "G:\Python27"
错误如题,node-gyp官网介绍不够详细,应设置python.exe的具体绝对路径,如下所示: npm config set python G:\Python27\python.exe 转载于:ht ...
- Microsoft Dynamics CRM 2015 服务器系统的性能维护,追踪, 也可以用到任务管理器哟...
Microsoft Dynamics CRM 2015 的追踪是一个很有用的function,它能为我们的CRM调试,评估 提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状态 ...
- 图论--2-SAT--poj 3678-Katu Puzzle(模板题)
Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...
- P4370 [Code+#4]组合数问题2
题目要求当\(0\leq a\leq b\leq n\)时,\(k\)个\(\tbinom{b}{a}\)的和的最大值 观察杨辉三角形,可以发现,最大的\(\tbinom{b}{a}\),为\(\tb ...
- 积性函数初步(欧拉$\varphi$函数)
updata on 2020.4.3 添加了欧拉\(\varphi\)函数为积性函数的证明和它的计算方式 1.积性函数 设\(f(n)\)为定义在正整数上的函数,若\(f(1)=1\),且对于任意正整 ...
- centos7 安装高版本svn
一.安装高版本svn 1.创建一个新的yum库文件,vim /etc/yum.repos.d/wandisco-svn.repo 内容如下 [WandiscoSVN] name=Wandisco SV ...
- 蒲公英 · JELLY技术周刊 Vol.05: Rust & Electron 的高性能实践 -- Finda
登高远眺 天高地迥,觉宇宙之无穷 基础技术 使用 JavaScript 框架的代价 作者从 JavaScript 下载时间.解析时间.执行时间.内存占用四个角度评测了 jQuery.Angular.R ...
- Jmeter的简单使用
前言 对于jmeter的使用有很多内容,本章节只是简单介绍jmeter的两个方面的内容:一个是使用jmeter模拟postman发送http请求,一个是使用jmete进行压力测试. 更多的内容请参考官 ...
- ssh框架整合时的延迟加载问题(no session问题)的分析以及解决方案
当我们整合完三大框架,并采用hibernate的延迟加载方案时,会出现如下的异常: 现在对这个异常进行分析,如下图所示(模拟通过id查询用户信息的过程): 上图分析了为什么会出现no session的 ...
- Coursera课程笔记----C程序设计进阶----Week 5
指针(二) (Week 5) 字符串与指针 指向数组的指针 int a[10]; int *p; p = a; 指向字符串的指针 指向字符串的指针变量 char a[10]; char *p; p = ...