今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector<struct> mFriendList;...std::vector<struct>::iterator iter = mFriendList.begin();for ( ; iter != mFriendList.end(); ++iter){    if (...)        mFr…
1. deque 的数据存取 这个部分和 vector 几乎一样 第一  使用下标操作 dequeName[0] = 100; //小心越界 第二  使用at 方法 如: dequeName.at(2) = 100; //小心越界 第三  接口返回的引用 dequeName.front() 和 deqIntA.back() 如下代码: 1 #include <iostream> 2 #include <deque> 3 4 using namespace std; 5 6 int…
在STL容器有顺序容器和关联容器两种. 顺序容器删除元素的方法有两种: 1.c.erase(p) 从c中删除迭代器p指定的元素.p必须指向c中一个真实元素,不能等于c.end().返回一个指向p之后元素的迭代器,若p指向c中的尾元素,则返回c.end() 2.3.c.erase(b,e) 删除迭代器对b和e所代表的范围中的元素.返回e 关联容器删除元素的方法有三种: 1.c.erase(k) 从c中删除每一个关键字为k的元素.返回一个size_type值,指出删除的元素的数量. 2.c.eras…
1.删除容器中特定值的元素 如果是容器vector,string,,deque,使用erase-remove 例如:erase-remove 注:因为container没有remove,container.erase(it),it为迭代器,std::remove()并不是真正的删除元素(size()大小没有变化),只是元素的替换 如果用list则使用remove,即list::remove 如果是关联式容器使用erase 2.删除容器中满足某些条件的所有元素 如果是容器vector,string…
Deque和Vector类似,只不过deque头尾都开放,能够在头尾进行快速插入和删除操作 DequeTest.cpp #include <iostream> #include <deque> #include <string> #include <algorithm> #include <iterator> #include "DequeTest.h" using namespace std; void DequeTest:…
有关stl容器删除元素的问题,错误的代码如下: std::vector<struct> mFriendList; ... std::vector<struct>::iterator iter = mFriendList.begin(); for ( ; iter != mFriendList.end(); ++iter) { if (...) mFriendList.erase(iter); } 记得当时Once给我说过这个问题,还给我改过代码,我当时不明白为什么,只知道程序执行的…
http://www.cppblog.com/beautykingdom/archive/2008/07/09/55760.aspx?opt=admin 在STL(标准模板库)中经常会碰到要删除容器中部分元素的情况,本人在编程中就经常编写这方面的代码,在编码和测试过程中发现在STL中删除容器有很多陷阱,网上也有不少网友提到如何在STL中安全删除元素这些问题.本文将讨论编程过程中最经常使用的两个序列式容器vector.list中安全删除元素的方法和应该注意的问题,       其它如queue.s…
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求    必须要求:     1.Copy构造函数     2.赋值=操作符     3.能够销毁对象的析构函数    另外:     1.可用的缺省构造函数,序列型容器必须,用于初始化元素     2.==操作符定义,用于判断相等     3.<操作符定义,关联型容器必须,用于缺省排序 你可在struct內加入 operator < ,就可以使struct有排序能力.因為而你的pcd struct內沒有指針,所以不須要有copy c…
课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座,进去的人已经确定好应该坐在哪了 算法:遍历 查找 删除 统计 … 迭代器:就理解为一个指针 STL中容器和算法式是离开的,通过迭代器进行操作 03 STL基本概念理论 迭代器其实是对指针的封装,是类对象,里面有各种重载 04 string字符串常用操作 05 string课堂案例   06 vec…
在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操作符,节省空间.但是其在分配的内存不够的情况下,需要对容器整体进行重新分配.拷贝和释放等操作,而且在vector中间插入或删除元素效率很低. 而list是以节点形式来存放数据,使用的是非连续的内存空间来存放数据,因此,在其内部插入和删除元素的时间复杂度都是O(1),但是其不支持随机访问和存取,不支持…
1.Deque容器 1)deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. 2)deque在接口上和vector非常相似,在许多操作的地方可以直接替换. 3)deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). 4)deque头部和尾部添加或移除元素都非常快速.但是在中部安插元素或移除元素比较费时. 5)头文件.#include <deque> 2.deque…
首先看看deque的模板声明: template <class T,  class Alloc = allocator<T>>  // 原本还有个参数BufSize,现在新版本内置了,不允许用户指定了. class deque { //… protected: // 数据成员 iterator start; // 表现第一个节点 iterator finish; // 表现最后一个节点 map_pointer map; // 指向map, map是块连续空间,其内的每个元素都是一个…
连续内存序列容器(vector, string, deque) 对于连续内存序列STL容器,例如vector,string,deque,删除当前iterator会使得后面所有的iterator都失效,因为它们使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置,保证元素的连续性.当上述容器的erase方法可以返回下一个有效的iterator,即erase方法的返回的iterator指向紧接在被删除元素之后的元素的有效迭代器,因此,可以根据这个返回值继续访问后面的元素. 连续内存…
deque是一个动态数组,deque与vector非常类似,vector是一个单向开口的连续线性空间,deque则是双向开口的连续线性空间.两者唯一的区别是deque可以在数组的开头和末尾插入和删除数据,而vector只能在末尾插入删除数据(当然,从技术层面上,vector也可以从首尾两端进行操作,但是其从头部操作效率奇差,无法接受). deque示意图 实质: deque(包含头文件#include<deque>)由若干段连续空间串接而成,一旦有必要在deque的头部或尾端增加新的空间,便配…
STL源码剖析---迭代器失效小结 vector迭代器的几种失效的情况: .当插入(push_back)一个元素后,end操作返回的迭代器肯定失效. .当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效. .当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效:指向删除点后面的元素的迭代器也将全部失效. deque迭代器的失效情况: 在C++Primer一书中是…
Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间.与vector不同的是,deque还支持从开始端插入数据:push_front(). 使用deque容器之前必须加上<deque>头文件:#include<deuqe>; deque属于std命名域的内容,因此需要通过命名限定:using std::…
deque与vector很相似,不仅能够在尾部插入和删除元素,还能够在头部插入和删除. 只是当考虑到容器元素的内存分配策略和操作性能时.deque相对vector较为有优势. 头文件 #include<deque> 创建deque对象 1)deque();//创建一个没有不论什么元素的deque对象. deque<int> d 2)deque(size_typen);//创建一个具有n个元素的deque对象.每一个元素採用它的类型下的默认值. deque<int> d(…
返回总册 本章节原文:http://www.cplusplus.com/reference/deque/deque/ 1. std::deque template < class T, class Alloc = allocator<T> > class deque; 双端队列 deque(发音类似"deck")是对double-ended-queue比较特殊的缩写方式.deque是动态长度的序列容器,可以向任意一端扩展或者从任意一端缩短. 不同的库对deque…
C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差别并不是很大,但是当数据达到一定数量后,会明显感觉性能上有很大差异. 本文就试图从介绍,以及性能比较两个方面来讨论这个问题. vector - 会自动增长的数组 list - 擅长插入删除的链表 deque - 拥有vector和list两者优点的双端队列 性能竞技场 性能总结与使用建议 测试程序清…
Vector 内部数据结构:连续存储,例如数组. 随机访问每个元素,所需要的时间为常量. 在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化. 可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存. 迭代器失效 插入:vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同).当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失效:…
1.连续内存序列容器(vector,string,deque) 序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全删除元素. vector<int> c; for(vector<int>::iterator it = c.begin(); it != c.end();) { if(need_delete())   it = c.erase(it);  else   ++it;  } 2.关联容器(set,multiset,map,m…
一.Stack(栈) 这个没啥好说的,就是后进先出的一个容器. 基本操作有: stack<int>q; q.push(); //入栈 q.pop(); //出栈 q.top(); //返回栈顶成员 q.size(); //返回栈成员个数 q.empty(); //判断是否为空栈 二.Queue(队列) 同上,先进先出的容器 基本操作有: queue<int>q; q.push(); //入队列 q.pop(); //出队列 q.front(); //返回最上面(最后进入)的成员 q…
1. 容器(Map & multimap)的插入 map.insert(...);    //往容器插入元素,返回pair<iterator,bool> map中插入元素的四种方式: 1 #include <iostream> 2 #include <map> 3 4 using namespace std; 5 6 int main() 7 { 8 map<int, string> mapStu; 9 10 //方法一: 构造一个 pair 然后插…
1. deque 的大小 deque.size();              //返回容器中元素的个数 1 #include <iostream> 2 #include <deque> 3 4 using namespace std; 5 6 int main() 7 { 8 deque<int> deqInt_A; 9 deqInt_A.assign(4, 111); 10 11 cout << "deqInt_A 中的元素个数为:"…
要使用C++中的标准模板库中的容器,其元素要满足以下三个条件: 元素必须可以通过copy构造函数进行复制,且二者进行相等测试返回true. 元素必须可以通过赋值操作符完成赋值操作. 元素必须可以通过析构函数完成销毁操作. 当然下面几种操作在需要时也必须满足: 序列容器构建非空容器时,默认构造函数是可用的. 搜索操作时,需要定义operator==运算符. 关联容器,元素必须定义出排序准则,默认使用operator<. (完)…
如果元素被保存在vector中,可先对vector里面的元素排序,然后调用unique函数去重,unique(起始迭代器,终止迭代器),返回的是去重以后vector中没有重复元素的下一个位置的迭代器.unique的实现原理大概是判断当前元素是否等于上一个元素,如果等于就将后一个元素向前覆盖掉当前的元素,所以执行完unique()以后返回的迭代器开始到vector.end()的元素都是没有意义的. 如果需要去除重复的元素,可使用下面的代码. #include <algorithm> #inclu…
 1.空间分配器 std::alloc用于容器中内存空间的分配和释放,以及分配内存的管理.construct().destroy()等全局函数用于为对象的构造和析构. 2.迭代器和trains 迭代器将容器和算法联系起来,行为类似指针.各个容器都自己实现自己的迭代器,最重要的是对operator*和operator-> 进行重载.每个迭代器里都定义了一些类型,包括所指对象的类型.trains将这些类型提取出来. STL的容器可以分为以下几个大类:一:序列容器, 有vector, list, de…
C++ STL 的实现: 1.vector      底层数据结构为数组 ,支持快速随机访问   2.list            底层数据结构为双向链表,支持快速增删   3.deque       底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问 deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下: [堆1] --> [堆2] -->[堆3] --> ... 每…
什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时…
STL容器能力一览表 Vector Deque List Set Multiset map Multimap 典型内部 结构 dynamic array Array of arrays Doubly Linked list Binary tree Binary tree Binary tree Binary tree 元素 Value Value Value Value Value Key/value pair Key/value pair 元素 可重复 是 是 是 否 是 对key而言否 是…