c++ 顺序容器学习
所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素”
而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序。
c++中的顺序容器一共有这么几种:
| vector | 可变大小数组 |
| deque | 双端队列 |
| list | 双向链表 |
| forward_list | 单向链表 |
| array | 固定数组大小 |
| string | 与vector相似的容器,但专门用于保存字符 |
这些容器可以让我们方便地放元素,取元素,but,她们在:添加、删除、非顺序访问,这些方面的性能都是不同滴(根据需要适当选择)
列了一大堆,就是为了有个印象,不知道她们是干啥的,后面慢慢学...
先不要逐个的去学,我们先来看一下共性的东西,下面是所有容器类型都提供的操作
| 类型别名 | |
| iterator | 迭代器 |
| const_iterator | 只读迭代器 |
| size_type | unsigned int,保证可以存下此种容器的最大可能长度 |
| difference_type | int, 足够保存两个迭代器之间的距离,是有符号的 |
| value_type | 元素类型 |
| reference | 元素的左值类型,即value_type& |
| const_reference | 即const value_type & |
| 构造函数 | |
| C c | 默认构造函数,构造空容器 |
| C c1(c2) | 构造了c1,内容是拷贝c2的 |
| C c(b, e) | 构造c,将迭代器b和e指定的范围内的元素拷贝到c |
| C c{a, b, c...} | 列表初始化c |
| 赋值与swap | |
| c1 = c2 |
将c1中的元素替换为c2中的元素 |
| c1 = {a,b,c...} | 将c1中的元素替换为列表中的元素(array不适用) |
| a.swap(b) | 交换a,b的元素 |
| 大小 | |
| c.size() |
c中元素的数目(forward_list不适用) |
| c.max_size() | c可保存的最大元素数目 |
| c.empty() | c是否为空,空true,不空false |
| 添加/删除元素 | |
| c.insert(args) | 将args中的元素拷贝进c |
| c.emplace(inits) | 使用inits构造c中的一个元素 |
| c.erase(args) | 删除args指定的元素 |
| c.clear() | 删除c中的所有元素,返回void |
| 关系运算符 | |
| ==, != | 是否相等,是否不等 |
| <, <=, >. >= | 关系运算符 |
| 获取迭代器 | |
| c.begin(), c.end() | 获取首元素,尾元素之后位置,的迭代器 |
| c.cbegin(), c.cend() | 返回const_iterator |
| 反向容器的额外成员 | |
| reverse_iterator | 反着寻址的迭代器 |
| const_reverse_interator | 只读的逆序迭代器 |
| c.rbegin(), c.rend() | 尾元素,首元素之前的迭代器 |
| c.crbegin(), c.crend() | 返回const_reverse_iterator |
好多...我都敲晕乎了
先有蛋才有鸡,首先我们来看“构造函数",一共分这么几种:
(1) 默认初始化; (2) 拷贝初始化; (3) 列表初始化; (4) 迭代器初始化; (5) 顺序容器特有初始化
用vector做个栗子,代码如下:
#include <iostream>
#include <vector> using namespace std; int main()
{
vector<int> vec1; //默认初始化
vector<int> vec2{,,,}; //列表初始化
vector<int> vec3{,,,};
vec3 = vec2;
vector<int> vec4(vec3); //拷贝初始化
vector<int> vec5(vec4.begin()+, vec4.end()-); //迭代器初始化
vector<int> vec6(,); //顺序容器特有初始化
return ;
}
seq_container_definition
执行结果gdb看一下:

好,然后我们来看一下迭代器,以及begin()和end()
迭代器和指针差不多,反正就是让我们来遍历着访问元素的,begin()取到第一个元素,end()取到?尾元素的后一个位置(one past the last element)
下面贴个snippet来看她的使用:
#include <iostream>
#include <string> using namespace std; int main()
{
string s("time for lunch");
string::iterator iter = s.begin();
while(iter != s.end()){
*iter = toupper(*iter);
iter++;
}
cout << s << endl;
return ;
}
seq_container_iterator
注意一点就是:如果你往容器对象里添加或者删除了元素,也即改变了对象容量,那么对象上原有的迭代器就会失效
c++ 顺序容器学习的更多相关文章
- c++ 顺序容器学习 - 容器适配器
摘要: 对 容器适配器 的疑问. 刚开始接触 容器适配器 时,总感觉怪怪的,认为多此一举,顺手搜了搜,原来我在这一点is not alone: STL容器适配器的用途 其中有个老兄说的好,这里 引用一 ...
- C++学习基础四——顺序容器和关联容器
—顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...
- C++系统学习之九:顺序容器
元素在顺序容器中的顺序与其加入容器时的位置相对应.关联容器中元素的位置由元素相关联的关键字值决定.所有容器类都共享公共的接口,不同容器按不同方式对其进行扩展. 一个容器就是一些特定类型对象的集合.顺序 ...
- 【c++ Prime 学习笔记】第9章 顺序容器
一个容器是特定类型对象的集合 顺序容器中元素的顺序与其加入容器的位置对应 关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器 所有容器类共享公有接口,不同容器按不同方式扩 ...
- c/c++ 标准顺序容器 容器的访问,删除 操作
c/c++ 标准顺序容器 容器的访问,删除 操作 pop_front:vector,string不支持 pop_back:forward_list不支持 知识点 1,front, back, at 成 ...
- c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作
c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作 关键概念:向容器添加元素时,添加的是元素的拷贝,而不是对象本身.随后对容器中元素的任何改变都 ...
- C++拾遗(四)——顺序容器
之前一篇博文(<初窥标准库>)简单了解了一种最常用的顺序容器:vector类型.本文将对该文内容进行进一步的学习和完善,继续讨论标准库提供的顺序容器类型.所谓顺序容器,即将单一类型的元素聚 ...
- Java容器学习——List
Java容器学习--List 基础知识 数组: 优点:随机存取,可以快速访问元素 缺点:静态分配内存,存在空间闲置或者溢出现象:不适合进行插入和删除操作,需要移动大量元素. 链表: 优点: ...
- C++ 顺序容器基础知识总结
0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...
随机推荐
- Nginx+php+fastcgi在win7下的配置
首先装载php 1.从www.php.net上下载php对应版本 2.解压之后放到c盘下(其实放哪无所谓,Apache会有配置指向,但是Nginx不用) 3.因为用的5.3.17版本,已经有了php- ...
- int unsigned实验
create table t1(a int unsigned,b int unsigned); insert into t1 select 1,2; select 1-2 from t1; Error ...
- Centos7 hostname重启失效
/etc/hosts 文件如下 [root@god ~]# more /etc/hosts 127.0.0.1 localhost ::1 localhost localhost.localdoma ...
- qml中打开本地html
main.cpp QString tmploc = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); QDi ...
- docker定制化镜像的构建及基于该定制的镜像创建容器
1.在项目里创建Dockerfile(注意大小写)文件,执行构建命令:docker build -t tiny-node-1 /root/tiny-node-docker 其中tiny-node ...
- Emoji表情符号录入MySQL数据库失败解决
让MySQL支持Emoji表情,涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集. utf8mb4和utf8到底有什么区别呢?原来以往的mysql的utf8一个字符最多3字节, ...
- JAVA 序列化
一.概念 序列化:将对象转换为字节序列的过程. 反序列化:将字节序列恢复为对象的过程. 二.简单示例 package serialization; import java.io.Serializabl ...
- java day2一个模拟双色球的代码
package day2; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt ...
- 重写equals方法
用下面的例子来进行解释. String name; int id; @Override public boolean equals(Object otherObject) { if (this == ...
- 查询oracle版本信息
select * from v$version;select * from v$instance;select * from nls_database_parameters;select * from ...