在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的使用的更多相关文章

  1. C++ vector 多次删除第一个元素

    转载声明: 代码都是来源于一下连接,做了一点点修改,为了记忆方便,故贴在这里,原文链接:http://blog.csdn.net/doctor_feng/article/details/1188078 ...

  2. C++ vector 删除一个指定元素 和 find 一个指定元素以及遍历删除、 map遍历删除元素和删除find到的元素

    vector: 1.delete element 转载:http://www.cnblogs.com/xudong-bupt/p/3522457.html #include <vector> ...

  3. 数组元素的删除 【vector】

    7-5 数组元素的删除(5 分) 完成数组元素的移动功能:假设数组有n个元素,输入一个数x,把数组的第x个位置的元素删除了,后面的元素依次前进一个位置. 重复若干次这样的删除,得到最后的结果. 输入格 ...

  4. 对于vector中高效删除中间元素的技巧

    众所周知,vector是连续存储空间,只提供高效的尾部删除方法pop_back() ,在中间删除的效率很低,那么如果大家想快速删除中间元素该如何实现? 话不多说,看代码: //移除vector元素,最 ...

  5. STL—— 容器(vector)元素的删除

    1. clear() 将整个 vector 都删除 使用 vectorname.clear() 可以将整个vector 中的元素全部删除,但是内存不会释放,如下代码: 1 #include <i ...

  6. 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.数组插入.删除 ...

  7. python列表删除--remove(),del,pop()

    remove()参数为列表元素,若在列表中,删除,不在则报错 如: pop()不带参数时默认删除列表的末尾元素并返回该元素,带参数时该参数为列表元素的下标值 不带参数: 以下标为参数: del 后面可 ...

  8. 关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论

    关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论 1.前言: 最近在做某一个题时,用到了vector的删除操作,利用的是erase()函数删除符合 ...

  9. TreeMap集合根据指定元素,进行删除和修改的两种方式实现及bug梳理

    TreeMap根据key中的指定元素进行删除修改的两种方式实现及注意事项: 方式一:利用增强for进行删除和修改 总结:逻辑简单,但是局限性太强,如果排序规则是从小到大进行排序的,则该方法不能进行删除 ...

随机推荐

  1. 前缀和小结 By cellur925

    这篇主要是来介绍前缀和的QAQ. 前缀和有一维的和二维的,一维的很容易理解,高中数学必修5第二章数列给出了前n项和的概念,就是前缀和.一维的我们在这里简单说一句. 一维前缀和 预处理:在输入一个数列的 ...

  2. Luogu P3320 [SDOI2015]寻宝游戏 / 异象石 【LCA/set】

    期末考试结束祭! 在期末考试前最后一发的测试中,异象石作为第二道题目出现QAQ.虽然知道是LCA图论,但还是敲不出来QAQ. 花了两天竞赛课的时间搞懂(逃 异象石(stone.pas/c/cpp)题目 ...

  3. 【BZOJ3514】Codechef MARCH14 GERALD07加强版(LCT_主席树)

    题目: BZOJ3514 分析: 看到这题真的是一脸懵逼无从下手,只好膜题解.看到「森林的联通块数 = 点数 - 边数」这一句话就立刻什么都会了 QAQ . 这题最重要的就是意识到上面那个式子(正确性 ...

  4. 题解报告:CODE[VS] 1082 线段树练习3(区间修改+区间查询)

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  5. 题解报告:hdu 1230 火星A+B(字符串)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230 Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要 ...

  6. [转]linux之date命令MYSQL用户管理

    转自:http://www.cnblogs.com/hencehong/archive/2013/03/19/mysql_user.html 一.        用户登录 格式: mysql -h主机 ...

  7. swiper4初始化/swiper-init/data-swiper

    用data属性初始化swiper <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. Java:核心概念j积累(一)

    1.      抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过 ...

  9. js添加千位分隔符

    function thousandBitSeparator(num){ var re=/\d{1,3}(?=(\d{3})+$)/g; var n1=num.toString().replace(/^ ...

  10. hibernate inverse属性

    修改街道对应的区道信息: 修改后会发现程序执行了两次修改操作: 原因: 区道与街道是一对多的关系: 由于Hibernate是双向维护外键,所以当修改区道中的街道时,会修改一次外键:在修改街道中的区道时 ...