C++容器学习
以前自学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++容器学习的更多相关文章
- Docker容器学习梳理 - 应用程序容器环境部署
关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...
- Docker容器学习梳理 - 日常操作总结
使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
- Java容器学习——List
Java容器学习--List 基础知识 数组: 优点:随机存取,可以快速访问元素 缺点:静态分配内存,存在空间闲置或者溢出现象:不适合进行插入和删除操作,需要移动大量元素. 链表: 优点: ...
- 【Ansible】ansible容器学习环境搭建
想要学习ansible,只有一个节点肯定是不行的,而搭建虚拟机又是一件非常费时费力费资源的事情,所以通过docker 快速搭建一个容器学习环境是一个不错的选择 1. 了解ansible部署 1.1 需 ...
- [原]容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...
- C++容器学习,与结构体排序和set来一场邂逅
最近学习C++容器,积累一下.下面介绍set和multiset,并使用sort对结构体进行排序.C++之路漫漫其修远兮! 一.对结构体进行排序 // sort_struct.cpp : 定义控制台应用 ...
- 并发容器学习—ConcurrentSkipListMap与ConcurrentSkipListSet 原
一.ConcurrentSkipListMap并发容器 1.ConcurrentSkipListMap的底层数据结构 要学习ConcurrentSkipListMap,首先要知道什么是跳表或跳 ...
- Docker容器学习与分享07
Docker容器网络 在分享06中学完了bridge网络,接着学习none网络和host网络. Docker在安装时会在host上默认创建三个网络,分别是bridge.host.null. [root ...
- Docker容器学习与分享06
Docker容器网络 Docker有三种原生网络:none网络.host网络.bridge网络. 先来学习一下bridge网络. 首先使用ifconfig命令查看一下本机的网络设备: 从图中可以看见多 ...
随机推荐
- 基于Struts2框架实现登录案例
一,准备工作 1)新建web项目,并导入Struts2jar文件和配置web.xml文件. struts2 jar文件 web.xml文件 <?xml version="1.0&qu ...
- Mysql:常用代码
C/S: Client Server B/S: Brower Server Php主要实现B/S .net IIS Jave TomCat LAMP:L Mysql:常用代码 Create table ...
- netty 解决TCP粘包与拆包问题(三)
今天使用netty的固定长度进行解码 固定长度解码的原理就是按照指定消息的长度对消息自动解码. 在netty实现中,只需要采用FiexedLengthFrameDecoder解码器即可... 以下是服 ...
- C# WebBrowser准确判断网页最终装载完毕
== 最近写了个软件叫WebAutoScript,目的用于,网页的自动操作处理,就是说,所有你在网页上面的操作,都可以录到一个脚本中,然后可以回放这个操作过程..我是说任何过程. 程序是用C#写的,其 ...
- CentOS 6.5系统使用yum方式安装LAMP环境和phpMyAdmin详细过程
介绍如何在CentOs6.2下面使用YUM配置安装LAMP环境,一些兄弟也很喜欢使用编译的安装方法,个人觉得如果不是对服务器做定制,用yum安装稳定简单,何必去download&make&am ...
- poj 1185 炮兵阵地(三维状态压缩dP)
题目:http://poj.org/problem?id=1185 思路: d[i][j][k]表示第i行的状态为第k个状态,第i-1行的状态为第j个状态的时候 的炮的数量. 1表示放大炮, 地形状态 ...
- POJ 2516 最小费用流
依然最小费用最大流模板题 建边麻烦了些 #include <cstdio> #include <cstring> #include <iostream> #incl ...
- UVa 1625 Color Length
思路还算明白,不过要落实到代码上还真敲不出来. 题意: 有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部. 对于每种颜色,其跨度定义为合并后的序列 ...
- fiddler2抓包工具使用图文教程
fiddler2抓包工具使用图文教程 三.fiddler实用功能使用说明: 1.fiddler捕获浏览器的会话: 能支持http代理的任意程序都能被fiddler捕获到,由于fiddler的运行机制就 ...
- php通过curl调用jpush接口实现消息的推送
public function actionNotifyto() { //$regid = $_REQUEST['regid']; $url = 'https://api.jpush.cn/v3/pu ...