vector删,erase和remove难怪--【STL】
供vector使用容器。通常只是一个简单的遍历查找,其他操作已执行,这不是,今天,稍有不慎。
erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个:
如对数据1 6 6 4 7;
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main()
- {
- vector<int> vec;
- vec.push_back(1);
- vec.push_back(6);
- vec.push_back(6);
- vec.push_back(4);
- vec.push_back(7);
- vector<int>::iterator arr;
- //vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());
- for(arr = vec.begin(); arr != vec.end(); arr++)
- {
- if(6 == *arr)
- {
- vec.erase(arr);
- //arr--;
- }
- }
- cout << "The size of vector is :" << vec.size() << endl;
- for(arr = vec.begin(); arr != vec.end(); arr++)
- {
- cout << *arr << " ";
- }
- cout << endl;
- return 0;
- }
进行如上操作的结果为:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGptMTk5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
有一个6未成功删除,因为每次循环后都将迭代器arr++,在成功删除之后节点后移了一位。实际上在删除进行时是后移了两位,故而在删除时:
- for(arr = vec.begin(); arr != vec.end(); arr++)
- {
- if(6 == *arr)
- {
- vec.erase(arr);
- arr--;
- }
- }
有了arr--操作,就可抵消删除时的自己主动后移。从而成功进行:
当然,erase还有另外一个方法,就是删除两个节点之间的所有元素。这时依靠remove操作将等于删除值的节点所有移到容器末尾。进行删除;
将上述for循环删除的凝视,将其上一行的vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());凝视取消就可以实现;
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main()
- {
- vector<int> vec;
- vec.push_back(1);
- vec.push_back(6);
- vec.push_back(6);
- vec.push_back(4);
- vec.push_back(7);
- vector<int>::iterator arr;
- vec.erase(remove(vec.begin(), vec.end(), 6), vec.end()); //
- /*for(arr = vec.begin(); arr != vec.end(); arr++)
- {
- if(6 == *arr)
- {
- vec.erase(arr);
- arr--;
- }
- }*/
- cout << "The size of vector is :" << vec.size() << endl;
- for(arr = vec.begin(); arr != vec.end(); arr++)
- {
- cout << *arr << " ";
- }
- cout << endl;
- return 0;
- }
O(∩_∩)O
版权声明:本文博客原创文章,博客,未经同意,不得转载。
vector删,erase和remove难怪--【STL】的更多相关文章
- C++——list中erase和remove的区别
1.之前在做相关的操作的时候,涉及到清除list相关的元素,因此会用到erase和remove,那么二者有什么区别呢? 从官方文档中,我们可以获取以下信息 erase : 说明:Removes fro ...
- map 和 vector 的erase函数说明
1. map的erase函数使用 这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在.根据参考文献1: 在C++98中: (1) void erase (it ...
- BZOJ 2878([Noi2012]-失落的游乐园树DP+出站年轮加+后市展望DP+vector的erase)
2878: [Noi2012]迷失乐园 Time Limit: 10 Sec Memory Limit: 512 MBSec Special Judge Submit: 319 Solved: ...
- 【转】vector中erase()的使用注意事项
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase( iterator _Whe ...
- 关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论
关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论 1.前言: 最近在做某一个题时,用到了vector的删除操作,利用的是erase()函数删除符合 ...
- vector元素的删除 remove的使用 unique的使用
在vector删除指定元素可用以下语句 : v.erase(remove(v.begin(), v.end(), element), installed.end()); 可将vector中所有值为el ...
- vector中erase用法注意事项
以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...
- vector的erase的用法
vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6); 可以直接从begin进行加减,比如我们要移除第3个 ...
- Leetcode 27 Remove Element STL
和remove zero类似的方法完成该题 class Solution { public: int removeElement(vector<int>& nums, int va ...
随机推荐
- c#.net公共帮助类
c#.net公共帮助类 比较全面的c#帮助类 比较全面的c#帮助类,日常工作收集,包括前面几家公司用到的,各式各样的几乎都能找到,所有功能性代码都是独立的类,类与类之间没有联系,可以单独引用至项目,分 ...
- POJ 3090 Visible Lattice Points (ZOJ 2777)
http://poj.org/problem?id=3090 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1777 题目大意: ...
- [React] Setup 'beforeunload' listener
In this lesson we'll show how to take a beforeUnload call and convert it to a declarative React Comp ...
- [TypeStyle] Style CSS pseudo elements with TypeStyle
Just like pseudo-classes, pseudo-elements are added to selectors but instead of describing a special ...
- Longest Increasing Subsequences(最长递增子序列)的两种DP实现
一.本文内容 最长递增子序列的两种动态规划算法实现,O(n^2)及O(nlogn). 二.问题描述 最长递增子序列:给定一个序列,从该序列找出最长的 升序/递增 子序列. 特点:1.子序列不要 ...
- python链表的实现,有注释
class Node(): #node实现,每个node分为两部分:一部分含有链表元素,成数据域;另一部分为指针,指向下一个 __slots__=['_item' ...
- 【69.77%】【codeforces 723A】The New Year: Meeting Friends
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- mysql去除字段内容的空格和换行回车
MySQL 去除字段中的换行和回车符 解决方法: UPDATE tablename SET field = REPLACE(REPLACE(field, CHAR(10), ''), ...
- js javascript正则
var re = new RegExp("^[0-9]$"); 或者 var re2 = /^\d$/;//这个好像兼容性更好,比如你在上面的语句里面写\d,就总是返回false, ...
- 打开cad文件的几种方法
转自原文 打开cad文件的几种方法 IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeature ...