以前自学C++的时候就没怎么看容器,一直以来也没怎么编过C++程序,现在想用C++写点东西,突感容器类型有些生疏,故做此笔记。(参考《C++ primer》

容器:容纳特定类型对象的集合。(定义很重要)

顺序容器:将单一元素聚集起来,根据位置来存储和访问元素。

标准库定义了三种容器:vector、list、deque

顺序容器适配器:stack、queue、priority_queue

顺序容器  
vector 支持快速随机访问
list 支持快速插入、删除
deque 双端队列
适配器  
stack LIFO
queue FIFO
priority_queue 有优先级管理的队列

容器初始化:

C<T> c;  初始化一个空的容器

C c(c2);  用已有容器初始化,要求c2类型与C的类型要相同

C c(b,e);  用迭代器范围或指针初始化,b,e指代对象的类型可与C不同

C c(n,t);  新容器有n个元素,每个初始化为t。(只适用于顺序容器,并要求元素类提供一个参数的构造函数)

C c(n);    新容器有n个元素(只适用于顺序容器,需要提供默认构造函数)

容器内元素的类型约束:1)、必须支持赋值运算;2)、必须可以复制;

指定容器的容器时:vector< vector<string> > lines; 要注意留空格;

迭代器和迭代器范围:

形如:vector<int>::iterator iter; //iter 相当于指针

*iter iter所指向元素的引用
iter->mem 解引用,获取指定元素中名为mem的成员
++iter、iter++或-- 自加减
==、!=
关系操作符 只适用于vector、deque
+、-、+=、-=等算术运算 只适用于vector、deque

注意:list的迭代器既不支持自述运算也不支持关系运算,它只提供前置和后置的自增、自减运算及相等、不等运算。

添加元素

c.push_back(t) 在末尾添加t
c.push_front(t) 在首部添加t,只适用于list和deque
c.insert(p,t) 在迭代器p前面搬迁 t,返回新加元素的迭代器
c.insert(p,n,t) 在p前插入n个t,返回void
c.insert(p,b,e) 在p前插入b,b指代的范围内元素,返回void

注意:任何insert和push操作都可能导致迭代器失效,当编写循环将元素插入到vector或deque中时,程序必须确保迭代器在每次循环后都得到更新。所以不要存储end操作返回的迭代器。

大小操作:

c.size()
c.max_size()
c.empty()
c.resize(n) 调整大小,填0或删除多余元素
c.resize(n,t) 调整大小,新元素赋值t

访问元素:

c.back() 返回最后一个元素的引用
c.front() 第一个元素的引用
c[n] 下标访问。只适用于vector和deque
c.at(n) 返回下标。如果下标无效会抛出异常。同样只适用于vector和deque

删除元素:

c.erase(p) 删除迭代器p处元素,返回指向后一元素的迭代器
c.erase(b,e) 删除迭代器标记的范围的所有元素
c.clear()
c.pop_back() 删除最后一个元素
c.pop_front() 删除第一个元素,只适用于list或deque

赋值操作:

c1=c2

c1.swap(c2) 交换内容(原迭代器不会失效)
c.assign(b,e)
c.assign(n,t) c重新设置为n个t值元素

vector的自增长:

vector每次调整容量为增加至当前容量的3/2。

 

容器的区别:

vector、deque:存储空间连续,对元素可以快速随机访问,vector在尾部插入删除很快速,但在其他位置插删效率较低,deque与vector类似,但在首尾的插删都很快速。

list:用链表组织元素,所以不支持随机访问,但在任意位置插删开销较小。

注意:编写代码时尝试只使用vector和list容器都能提供的操作,使用迭代器,而不是使用下标并避免随机访问元素。这样在必要时,可很方便地将程序从使用vector容器修改为使用list容器。

适配器区别:

stack栈可以建立在vector、list或deque容器之上;

queue要求其基础容器提供push_front运算,因此只能建立在list容器上;

priority_queue要求提供随机访问功能,因此可建立在vector、deque上。

栈:

支持查询是否为empty(),以及大小size(),还有pop():删除栈顶;top():返回栈顶元素;push():压入新元素

队列和优先线队列:

队列:FIFO

优先级队列:将新元素根据优先级,放在比新元素优先级低的元素的前面。

支持的函数:empty(); size(); pop(); front():返回队首元素,只适用于队列;back():返回队尾元素,只适用于队列;top():返回最高优先级元素值,只适用于优先级队列;push();

string类型

string可以看成一个特殊的容器,其操作很多与vector容器类似。

但,在string中不支持栈方式的操作,即不能使用front、back和pop_back操作。

当然,string还提供了其他很多容器所没有的函数,如append、replace、find、find_first_of、find_first、compare等等。

C++容器学习的更多相关文章

  1. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  2. Docker容器学习梳理 - 日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...

  3. STL序列式容器学习总结

    STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...

  4. Java容器学习——List

    Java容器学习--List 基础知识 数组: ​ 优点:随机存取,可以快速访问元素 ​ 缺点:静态分配内存,存在空间闲置或者溢出现象:不适合进行插入和删除操作,需要移动大量元素. 链表: ​ 优点: ...

  5. 【Ansible】ansible容器学习环境搭建

    想要学习ansible,只有一个节点肯定是不行的,而搭建虚拟机又是一件非常费时费力费资源的事情,所以通过docker 快速搭建一个容器学习环境是一个不错的选择 1. 了解ansible部署 1.1 需 ...

  6. [原]容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...

  7. C++容器学习,与结构体排序和set来一场邂逅

    最近学习C++容器,积累一下.下面介绍set和multiset,并使用sort对结构体进行排序.C++之路漫漫其修远兮! 一.对结构体进行排序 // sort_struct.cpp : 定义控制台应用 ...

  8. 并发容器学习—ConcurrentSkipListMap与ConcurrentSkipListSet 原

    一.ConcurrentSkipListMap并发容器 1.ConcurrentSkipListMap的底层数据结构     要学习ConcurrentSkipListMap,首先要知道什么是跳表或跳 ...

  9. Docker容器学习与分享07

    Docker容器网络 在分享06中学完了bridge网络,接着学习none网络和host网络. Docker在安装时会在host上默认创建三个网络,分别是bridge.host.null. [root ...

  10. Docker容器学习与分享06

    Docker容器网络 Docker有三种原生网络:none网络.host网络.bridge网络. 先来学习一下bridge网络. 首先使用ifconfig命令查看一下本机的网络设备: 从图中可以看见多 ...

随机推荐

  1. JCIFS读取远程服务器文件过慢的解决方法

    JCIFS读取远程服务器文件过慢的解决方法 发表于3年前(2013-07-12 11:23)   阅读(1174) | 评论(0) // 我要收藏"; var favor_del = &qu ...

  2. 经典K线组合图解 > 正文

    日K线波段中上下影线的箱体操作法(完整) http://video.sina.com.cn/v/b/130809461-2486130757.html!!经典K线组合图解 > 正文 http:/ ...

  3. 高性能Web框架Zend Framework

    Zend Framework (ZF)是用 PHP 5.3及更高版本来开发 Web 程序和服务的开源框架.ZF用100% 面向对象编码实现. ZF的组件结构独一无二,每个组件几乎不依靠其他组件.这样的 ...

  4. Python中的 isdigit()方法

    Python isdigit()方法 sdigit()方法就是检测字符串是否只有数字组成, 如果字符串中是只有数字组成,则返回true, 如果字符串中有其他字符,则返回false. 语法格式是:  s ...

  5. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  6. Lunix中文乱码解决方案

    sudo vi /var/lib/locales/supported.d/local#添加下面的中文字符集zh_CN.GBK GBKzh_CN.GB2312 GB2312zh_CN.GB18030 G ...

  7. tomcat web.xml 配置

    1<web-app> 2<error-page> 3<error-code>404</error-code> 4<location>/Not ...

  8. RAPIDXML 中文手册,根据官方文档完整翻译!

    简介:这个号称是最快的DOM模型XML分析器,在使用它之前我都是用TinyXML的,因为它小巧和容易上手,但真正在项目中使用时才发现如果分析一个比较大的XML时TinyXML还是表现一般,所以我们决定 ...

  9. ASCII码常用值

    大写字母 A~Z 65~90 小写字母a~z 97~122 数字0~9 48~ 57

  10. bzoj1499: [NOI2005]瑰丽华尔兹

    dp. 首先我们可以看到每个时间段只能往一个方向转移最多t步(t为时间段的长度),所以我们可以按时间段dp.因为这个前后值互不影响,也不用占用这一维空间就可以省去. 然后每个时间段内是一列一列(行) ...