C++拾遗(四)——顺序容器

  之前一篇博文(《初窥标准库》)简单了解了一种最常用的顺序容器:vector类型。本文将对该文内容进行进一步的学习和完善,继续讨论标准库提供的顺序容器类型。所谓顺序容器,即将单一类型的元素聚集起来成为容器,并根据位置来存储和访问这些元素。标准库定义了三种顺序容器类型:vector,list和deque(double-ended queue双端队列)。同时还提供了三种顺序容器适配器(adaptor):stack,queue,priority_queue。

顺序容器 vector 支持快速随机访存
list 支持快速插入/删除
deque 双端队列
顺序容器适配器 stack 后进先出栈
queue 先进先出队列
priority_queue 有优先管理的队列

顺序容器的定义及迭代器

  • 容器元素类型必须满足两个条件:元素支持赋值运算,元素对象可以复制。以上为容器要满足的最低限度,关联容器则需要满足其他元素。注意到,引用不支持赋值运算,IO库类型不支持赋值或复制,故两者都不能作为容器的元素。
  • 注意:容器定义时,必须用空格隔开两个相邻的>符号,否则系统会将>>当作右移操作符,导致编译错误。
1 vector< vector<string> > liens; //ok
2 vector < vector<string>> lines; //error:>>treated as shift operator
  • 标准库为迭代器提供一些常用的运算,如解引用,自增自减等。
  • 关系操作符只适用于vector和deque容器,因为它们提供快速随机访存,可以根据元素位置直接访问容器元素。而list容器的迭代器既不支持算术运算,也不支持关系运算。
  • 迭代器范围为左闭合区间,即[first,last),表示从first所指示的位置到last所指示的位置之前的所有元素。对迭代器的要求为:它们指向同一个容器中的元素或超出末端的下一位置;first反复做自增运算能够到达last。
  • 某些容器操作会修改容器的内在状态或移动容器内的元素,这样将会使部分迭代器失效,进而导致与悬垂指针同样的问题。考虑如下两段代码,有何不同?为何?

     1 vector<int>::iterator mid = iv.begin() + iv.size()/2;
     2 vecor<int>::iterator iter = iv.begin();
     3 while (iter != mid)
     4     if (*iter == someVal)
     5         iv.insert(iter, 2*someVal);
     6
     7 vector<int>::iterator iter = iv.begin();
     8 while (iter != iv.begin() + iv.size()/2)
     9 {
    10     if (*iter == someVal)
    11     {
    12           iter = iv.insert(iter, 2*someVal);
    13           iter += 2;
    14     }
    15     else
    16         ++iter;
    17 }

顺序容器的操作

  • 一些基本的操作,如begin和end成员,insert操作,resize操作,erase操作,assign操作,关系操作符等。

vector容器的自增长

  • vector类提供了两个成员函数:capacity和reserve,前者获取在容器需要分配更多的存储空间之前能够存储的元素总数,后者则告诉容器应该预留多少空间。注意,capacity不等于size。

容器的选用

  • 若要随机访存元素,应使用vector或deque。
  • 若要在容器的中间位置插入或删除元素,应使用list。
  • 若是在首尾部分插入或删除,使用deque。
  • 如果只需要在读取输入时在容器的中间位置插入元素,然后需要随即访问元素,则可将元素读入list容器,接着对此容器重新排序,使之适合顺序访问,在复制到vector中。
  • 选择容器的核心取决于:随机访存list的代价与在vector/deque中插入删除时复制元素的代价。
时间: 2024-10-13 11:29:46

C++拾遗(四)——顺序容器的相关文章

C++学习基础四——顺序容器和关联容器

—顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue> (1)vector声明 vector<string> svec;(2)添加元素: c.push_back(t): 在容器 c 的尾部添加值为 t 的元素.返回 void 类型  c.push_front(t):在容器 c 的前端添加值为 t 的元素.返回 void 类型 只适用于 lis

C++ Primer 第四版读书笔记(八)之顺序容器

容器容纳特定类型对象的集合. 标准库vector类型,是一个顺序容器.它将单一类型元素聚集起来称为容器,然后根据位置来存储和访问这些元素,这就是顺序容器.顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定. 标准库定义了三种顺序容器类型:vector.list和deque.它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价.标准库还提供了三种容器适配器.实际上,适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型. 顺序容器类型 顺

C++ Primer 第四版读书笔记(八)之顺序容器(续)

3.6 访问元素 如果容器非空,那么容器类型的front和back成员将返回容器内第一个或最后一个元素的引用. 访问顺序容器内元素的操作 c.back() 返回容器c的最后一个元素的引用.如果c为空,则该操作未定义 c.front() 返回容器c的第一个元素的引用.如果c为空,则该操作未定义 c[n] 返回下标为n的元素的引用 如果n<0或n>c.size(),则该操作未定义 只适用于vector和deque容器 c.at[n] 返回下标为n的元素的引用.如果下标越界,则该操作未定义 只适用于

C++primer拾遗(第九章:顺序容器)

第九章顺序容器的总结,太常用了所以太重要了. 不过里面的string部分太多,没有写上来,以后要用的时候直接查书吧 总结不易,转载注明出处,谢谢. http://www.cnblogs.com/linhaowei0389/

C++ Primer 第九章顺序容器

一.综述 <vector>:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢. <deque>:双端队列.支持快速随机访问.在头尾位置插入/删除速度很快. <list>:双向链表.只支持双向顺序访问.在list中任何位置进行插入/删除操作速度都很快. <forward_list>:单向链表.只支持单向顺序访问.在链表任何位置进行插入/删除操作速度都很快. <array>:固定大小数组.支持快速随机访问.不能添加或删除元素.

C++ primer笔记——第九章 顺序容器

顺序容器的元素按照其位置存储和访问.除了顺序容器之外,标准库还提供了几种关联容器,其元素按照键(key)排序.每组容器都提供一组不同的时间和功能的折中方案.顺序容器根据位置来存储和访问元素,元素的排列次序与元素值无关,而是由元素添加到容器的顺序决定.标准库定义了三种顺序容器:vector.list.dequeue.他们的差别在于元素访问的方式以及添加和删除元素相关操作的运行代价.标准库还提供了三种适配器.适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口来适应基础的容器类型.顺序容器适

顺序容器(幕后英雄) — heap

heap不属于STL容器,它扮演者priority queue的助手.heap是一种完全二叉树,可由数组来实现,但heap需要动态改变大小,所以最终选择了vector作为底层容器.STL默认提供最大堆. 题外话:分析heap的源码就能清楚的理解堆这种数据结构的例程,而STL库代码的质量又很高,所以看堆的代码,STL源码是一个很好的选择. 为了满足完全二叉树的性质,新插入的元素一定最后一个叶子节点,也就是容器尾端,再然后再进行上滤操作,让新元素找到正确的位置.以push_heap为例: templ

第十篇:顺序容器vector,deque,list的选用规则

前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(vector实现原型是顺序表,deque是双端队列,list是链表),因此这三种容器对插入删除以及访问操作的开销是不同的.为了编制出高效的程序,我们应当通过分析容器操作的开销来选择容器. 访问操作对容器选择的影响 1. vector容器的随机访问效率最高: 2. deque容器的随机访问效率也高: 3

c++顺序容器(1)

1.顺序容器 C++标准库中有三种顺序容器:vector list deque vector:支持快速随机访问,在尾部之外的位置插入或删除元素可能较慢 list:支持快速插入/删除,只支持双向顺序访问 deque:双端队列,支持快速随机访问,头尾插入和删除速度很快 还有array(不能添加和删除),forward_list,String(保存字符) 2.哪种顺序容器好? 通常,使用vector. (1)如果要求在容器的中间插入和删除元素,应使用list或forward_list. (2)如果只在