前言
上一篇章写了常用的顺序容器以及不同顺序容器之间的区别。这篇博客主要是写顺序容器的一些基本操作和一些常用函数,以通用的操作为基准。
1. 类型别名
在一些函数源码说明对应的API中,涉及到一些类型别名,这里做一个汇总
类型名称 | 说明 | 个人理解 |
---|---|---|
iterator | 此容器类型的迭代器 | 一个类似于指针的玩意儿,用来访问容器 |
const_iterator | 可以读取元素,但不能修改元素的迭代器类型 | 类似const ptr这种,常指针,指针本身不能发生改变 |
size_type | 无符号整数类型,足够保存两个迭代器之间的距离 | unsigned int |
difference_type | 带符号整数类型,足够保存两个迭代器之间的距离 | int |
value_type | 元素类型 | 容器内存放的元素对应的类型,比如vector存放int类型数据,那么这个value_type就是int |
reference | 元素的左值;与value_type&类型相同 | 类似于C++中的引用,取别名 |
const_reference | 元素的const左值类型(const value_type &) | 不可更改的左值 |
2. 构造函数
容器的构造方式有很多种,最常见的可能是默认构造函数,就是我声明一个容器之后,系统默认给他一个构造空容器的函数。
下面以容器类型C作为泛称,C可以是一般容器类型容器。
构造函数 | 构造函数说明 | 个人理解 |
---|---|---|
C c | 默认构造函数,构造空容器。array例外。array一般是array<int ,42> | 用对象的方式来理解,声明一个C类的对象,构造函数默认 |
C c1(c2) | 构造c2的拷贝c1 | 声明C容器类对象c1,用c2来进行拷贝构造 |
C c(b,e) | 构造c,将迭代器b和e指定的范围内的元素拷贝到c。(array不支持) | 将一个范围的值用来初始化一个新的容器 |
C c{a,b,c…} | 列表初始化C | 定义了一个容器的对象,容器内存放a,b,c…元素数据 |
3. 赋值与swap
写法 | 说明 | 个人理解 |
---|---|---|
c1=c2 | 将c1中的元素替换为c2中的元素 | c2赋值给c1 |
c1={a,b,c…} | 将c1中的元素替换为列表中元素(不适用与array) | 用列表的方式进行赋值 |
a.swap(b) | 交换a和b的元素 | |
swap(a,b) | 与a.swap(b)等价 |
4. 大小
操作 | 说明 | 个人理解 |
---|---|---|
c.size() | c中的元素数目(不支持forward_list) | 主要用来获取容器中有效元素个数 |
c.max_size() | c可保存的最大元素数目 | 主要获取c的容量大小 |
c.empty() | 若c中存储了元素,返回false,否则返回true | 一般用来做判断条件,看容器是否为空 |
5. 添加/删除元素
操作 | 说明 | 个人理解 |
---|---|---|
c.insert(args) | 将args中的元素拷贝进c | 容器对象c调用insert函数,向容器内部插入元素c |
c.emplace(inits) | 使用inits构造c中的一个元素 | |
c.erase(args) | 删除args指定的元素 | |
c.clear() | 删除c中的所有元素,返回void | 清空容器 |
6. 迭代器获取与关系运算符
类比与普通变量之间的关系运算符
所有的容器都支持相等(不等)运算符:==,!=
无序关联容器不支持关系运算符:<,<=,>,>=
操作 | 说明 | 个人理解 |
---|---|---|
c.begin(),c.end() | 返回指向c的首元素和尾元素之后的迭代器 | |
c.cbegin(),c.cend() | 返回const_iterator | 返回的迭代器是不可修改的 |
总结
这篇博客归纳了一下容器的一些常用操作,这里的操作都是泛型的,具体的容器还要具体对待。