vector元素的删除 remove的使用 unique的使用
在vector删除指定元素可用以下语句 :
v.erase(remove(v.begin(), v.end(), element), installed.end());
可将vector中所有值为element的元素删除。
以上转自:http://blog.csdn.net/ozwarld/article/details/7761519
以下转自:http://blog.csdn.net/zlhy_/article/details/8784553
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());
out<<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"。
以上展示还未用的sort()排序函数。现在来看sort()的加入会有什么新的变化。
前面说到unique()和unique_copy()函数都是针对相邻之间相同字符的剔除,他们并不会从一个字符串的整体去剔除重复字符,如果不用sort()函数,那么我们想要获取一个字符串所包含的的字符集并不是每一次都能保证正确的(如果字符串中没有相同的字符就是正确的,如果相同的字符都是在相邻位置出现结果也是正确的,但大多数情况下却不是这么回事)。
string str = "zhaohaoyang";
vector<char> vecch(str.begin(), str.end());
sort(str.begin(), str.end());
str.erase(unique(str.begin(), str.end()), str.end());
cout<<str<<endl; //输出:aghnoyz
在第二段代码中两行展示的不能剔除重复字符,现在可以从一个字符串出发剔除重复字符了,可以获取一个字符串的字符集了。关键在于使用了sort()函数对字符串进行排序,排序后的字符串相同字符都会集中出现,所以unique()就能正确发挥功能了。
上面所展示的是把获取的字符集存储在了源字符串变量中,如果遇到要把字符集放置在额外的变量中的情况,就要用到unique_copy()函数了。来看一段代码:
string str = "zhaohaoyang";
string dststr;
dststr.resize(str.size());
sort(str.begin(), str.end());
dststr.resize(unique_copy(str.begin(), str.end(), dststr.begin()) - dststr.begin());
cout<<dststr<<endl; //输出:aghnoyz
dststr是存储字符集的目标串,str是源字符串变量。dststr在用之前必须要先设置大小,否则到unique_copy()的时候会报内存错误,因为是要存储字符串的字符集,所以dststr设置和源字符串相同的大小是完全可以的,最后再把剩余的位置erase掉就好了。
vector元素的删除 remove的使用 unique的使用的更多相关文章
- C++ vector 多次删除第一个元素
转载声明: 代码都是来源于一下连接,做了一点点修改,为了记忆方便,故贴在这里,原文链接:http://blog.csdn.net/doctor_feng/article/details/1188078 ...
- C++ vector 删除一个指定元素 和 find 一个指定元素以及遍历删除、 map遍历删除元素和删除find到的元素
vector: 1.delete element 转载:http://www.cnblogs.com/xudong-bupt/p/3522457.html #include <vector> ...
- 数组元素的删除 【vector】
7-5 数组元素的删除(5 分) 完成数组元素的移动功能:假设数组有n个元素,输入一个数x,把数组的第x个位置的元素删除了,后面的元素依次前进一个位置. 重复若干次这样的删除,得到最后的结果. 输入格 ...
- 对于vector中高效删除中间元素的技巧
众所周知,vector是连续存储空间,只提供高效的尾部删除方法pop_back() ,在中间删除的效率很低,那么如果大家想快速删除中间元素该如何实现? 话不多说,看代码: //移除vector元素,最 ...
- STL—— 容器(vector)元素的删除
1. clear() 将整个 vector 都删除 使用 vectorname.clear() 可以将整个vector 中的元素全部删除,但是内存不会释放,如下代码: 1 #include <i ...
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...
- python列表删除--remove(),del,pop()
remove()参数为列表元素,若在列表中,删除,不在则报错 如: pop()不带参数时默认删除列表的末尾元素并返回该元素,带参数时该参数为列表元素的下标值 不带参数: 以下标为参数: del 后面可 ...
- 关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论
关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论 1.前言: 最近在做某一个题时,用到了vector的删除操作,利用的是erase()函数删除符合 ...
- TreeMap集合根据指定元素,进行删除和修改的两种方式实现及bug梳理
TreeMap根据key中的指定元素进行删除修改的两种方式实现及注意事项: 方式一:利用增强for进行删除和修改 总结:逻辑简单,但是局限性太强,如果排序规则是从小到大进行排序的,则该方法不能进行删除 ...
随机推荐
- pyinstaller打包.py程序为.exe操作指南
pyinstaller打包.py程序为.exe操作指南 20190526内容纲要: 1.pyinstaller安装 2.程序封装 3.可执行程序 0 前言 今天第一次试试将一个py程序封装成一个.ex ...
- 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减 直至765398并保持此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动 ,当数码管上数减到停止时,实验板上流水灯出停止然后全部开始闪烁,3秒后(用 T0定时)流水灯全部关闭,数码管上显示出“HELLO”,到此保持住
#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigne ...
- 前端基础jQuery
jQury jQuery 是一个 JavaScript 函数库,jQuery 极大地简化了 JavaScript 编程. jQuery库包含以下功能: HTML 元素选取 HTML 元素操作 CSS ...
- [POI2008]海报PLA
Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值 ...
- android将对象序列化到文件:直接写文件与用Serializable接口的对比
1.用文件读写1024个对象的日志 10-09 16:12:44.493 6385-6385/com.example.tt.downtest D/Serializable_TAG: write 102 ...
- 外文翻译 《How we decide》 Introduction
书籍PDF版地址:How we decide 本文为书籍导言部分的拙劣翻译. 当我驾驶着波音737驶向东京成田国际机场时,飞机的引擎突然起火了.此时我们正处于7000英尺的高空,机场的跑道就在不远的前 ...
- Vue.js学习笔记--4. 组件的基本使用
整理自官网教程 -- https://cn.vuejs.org/ 1. 所有Vue组件同时也都是Vue实例,分为全局组件和局部组件,注册方式如下. <div id="app" ...
- 开发小Tips
Kotlin语言篇: 1.抽象类的定义 abstract class Person(var name : String, var age : Int) : Any() { abstract var a ...
- Python学习 Day 2-数据类型和变量
数据类型和变量 在Python中,能够直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080, ...
- 黑马程序员----java基础:异常
dff ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 经常写程序的人对try...catch...finally语句肯定是不陌生的了.但是好多 ...