文章目录
C++中常用的std标准容器
从c++11标准以来,c++中std定义的几种容器的效率非常高,优化的非常好,完全没有必要自己去定义类似的数据结构。了解使用它们,可以满足90%的日常编程需要。该篇文章基于c++11标准,从用户角度来介绍常用的顺序容器与并联容器(如果想从内部了解它们是怎么实现的,推荐看看《std源码剖析》这本书)。它们包括:
顺序容器:
vector
string (它不是类模板)
list
forward_list
deque
queue
priority_queue
stack
有序关联容器:
map
multimap
set
multiset
无序关联容器:
unordered_map
unordered_multimap
unordered_set
unordered_multiset
力推网站: https://en.cppreference.com/w/cpp/container
, 里面介绍的绝对很全的,绝对比本篇文章好太多太多。
很多容器功能是重复的,不再一一列举
顺序容器
1. vector容器
a. vector的定义与初始化
// T 表示实例化类模板时使用的类型
vector<T> v1 // 默认初始化, 此时v1为空。
vector<T> v1(v2) // 执行的copy初始化,此时v1与v2的内容相同
vector<T> v1 = v2 // 与上面相同,都会执行copy构造函数
vector<T> v1(n) // 此时v1的size大小为n ,它里面的值是根据T的类型进行默认初始化的
vector<T> v1(n, a) // v1的初始化为n个值为a的元素
vector<T> v1{
a, b, c} // 列表初始化,v1内现在的元素就是a, b, c (这是c++11标准新入的)
vector<T> v1 = {
a, b, c} // 与上面相同
列表初始化是什么?
对于上面的几种初始化方法,最常用的有三种,
- 默认初始化,这里vector为空;
- 2.copy初始化,这时用另一个vector初始化该vector
- 列表初始化,为vector 初始化一些初始值。 几乎或很少在初始化vector的时候去设定它的size大小,因为vector的push_bask是非常高效的,甚至比提前设置它的大小更高效(见c++primer plus书中更加详细)
b. vecotr常使用的操作
- 属性操作
v1.size() //v1内已经存放的元素的数目
v1.capacity() // v1现有的在存储容量(不再一次进行扩张内存空间的前提下)
v1.empty() // 判断v1是否为空
v1.max_size() // 返回vector可以存放的最大元素个数,一般这个数很大,因为vector可以不断调整容量大小。
v1.shrink_to_fit() // 该函数会把v1的capacity()的大小压缩到size()大小,即释放多余的内存空间。
- 访问操作:访问操作都会返回引用,通过它,我们可以修改vector中的值。
v1[n] // 通过下标进行访问vector中的元素的引用 (下标一定要存在 ,否则未定义,软件直接崩了)
v1.at(n) // 与上面类似,返回下标为n的元素的引用,不同的是,如果下标不存在,它会抛出out_of_range的异常。它是安全的,建议使用它。
v1.front() // 返回vector中头部的元素的引用(使用时,一定要进行非空判断)
v1.back() // 返回vector中尾部的元素 引用(使用时,一定要进行非空判断)