1.容器概述
容器:一种特殊的类型,其对象可以放置其他类型的对象(元素)
支持的操作有:添加,删除,索引,遍历
容器的分类:
序列容器:其中的对象有序排列,使用整数值进行索引
关联容器:其中的对象顺序并不重要,使用键进行索引
适配器:调整原有容器的行为,使得对外展现出新的类型,接口,或返回新的元素.
生成器:构造元素序列
迭代器: 用于指定容器的一段区间,以执行遍历,删除等操作
获取迭代器:c/begin() c/end() c/rbegin() c/rend() r--reverse反向迭代器
迭代器的分类:
输入/输出迭代器 前向迭代器 双向迭代器 随机访问迭代器
每个迭代器都支持特定的操作. 输入迭代器和输出迭代器比较特殊,它们不是把数组或容器当做操作对象,而是把输入流/输出流作为操作对象.前向迭代器只支持++p;p++,p* .双向迭代器支持++p p++ --p p-- p*,随机迭代器支持最多
std::vector<int>x{1,2,3,4,5};
auto b=x.begin(); b指向x的第一个元素
auto e=x.end(); e指向x中最后一个元素的下一位
for(auto ptr=b;b!=e;++ptr)
{
std::cout<<*ptr<<' ';
}
cbegin() cend() 只读迭代器
2.序列容器
STL提供了多种序列容器模板:
--array 元素个数固定的序列容器
--vector 元素连续储存的序列容器
--forward_list/list 基于链表/双向链表的容器
--deque 分段连续存储的容器 vector与list的折中
--basic_string 对字符串专门的支持
-需要使用元素类型来实例化容器模板,从而构造可以保存具体类型的容器
-不同容器提供的借口大致相同,但是根须容器的底层结构差异,内部实现复杂度不同
-对于复杂度过高的操作,提供了相对较难使用的借口或者不提供相应的借口
array
array容器模板:具有固定长度的容器,期内部维护了一个內建数组,与內建数组相比提供了复制操作. 包含头文件#include<array> std标准命名空间
template<class T,size_t N>struct array;
构造:
array<int,3>a={}; 全为0
array<int,3>a{1,}; 第一个为1 其余全为0
array<int,3>a; 默认随机值
元素访问:
array<int,3>a{1,2,3};
cout<<a[1]<<endl; 2
cout<<a[100]<<endl; []越界返回乱值
cout<<a.at(100)<<endl; at() 越界 程序崩溃
cout<<a.front()<<endl; 1
cout<<a.back()<<endl; 3
cout<<a.data()<<endl; 返回c语言类型的指针, int* 指向首地址
元素在内存连续保存才有data 接口 list无data接口
cout<<a.enpty()<<endl;
cout<<a.size()<<endl;
cout<<a.max_size()<<endl;
array<int,3>b{5,6,7};
a.swap(b);
vector
vector容器模板:元素数目可变
vector内部维护了 size_t size(大小) size_t cap(容量) T*buffer (指向连续内存的指针)
一般vector会多分配一倍的内存,来提高性能. 当本段内存分配满了,就会重新找一段连续的内存空间,buffer指向它的首地址.
接口:
-容量相关 capacity/reserve/shrink_to_fit
reverse() 开辟多好个类型的空间 shrink_to_fit 释放多余的内存
-附加元素接口: push_back emplace_back
push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素); emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
元素插入接口: insert emplace
元素删除接口: pop_back erase clear
Notes:
-vector不提供push_front/pop_front接口 可以使用insert/erase模拟 但是效率不高
-swap效率较高 直接交换指针的指向即可
-写操作可能会导致迭代器失效
迭代器失效的操作:
swap clear = assign reserve shrink_to_fit erease push_back emplace_back
insert emplace resize pop_back
改变内存的操作都可能会使迭代器失效 ,