序列容器(sequential contains)
- 序列容器储存一组特定类型的对象,控制元素的存储和访问顺序。
- 其中array有固定的大小,vector,string连续储存,易于查找而不易于增删元素,list,forward_list则相反。而deque能快速查找且仅在末尾易于增删。
- 一般使用vector或list除非有其他原因。
- 若在中部增删且只读,可以先用list储存,再复制为vector。
-
概览
- 迭代器(iterator) 的begin指向第一个元素,而end指向最后一个元素的下一位。此外,迭代器还提供了“++”,“- -”(除了forward_list)来访问元素。
//使用auto定义迭代器的类型取决于a的类型 auto it = a.begin() //只有a为const时it为const auto it = a.cbegin() //it is const
- 容器的类型成员
size_type, iterator, const_iterator reserve iterator //反向迭代器 vector<int>::difference_type //声明需要使用范围运算符
- 容器的初始化
vector<type> v(v1) //直接拷贝初始化,除了array,注意类型相同 vector<type> v(v1.begin(),v1.end()) //拷贝另一个容器的指定范围 vector<type> v = {...}; //列表初始化 vector<type> v(10); //若type没有默认构造函数,则在size之后要赋值 //vector<type> v(10,init) array<basic_type,10> arr = {0}; //array类型定义必须包含大小
- assign and swap 的左右类型必须相同。
//注意,array不能用{}分配值 array<int,3> arr; arr = {}; //error
-
序列容器的操作
- 添加元素
//由于push等操作通过拷贝传值,而emplace通过argument更快, //建议使用emplace push_back() //include string, but aside from forward_list,array emplace_back() push_front() //support deque,list,forward_list emplac() insert(iter,val) //insert val before iter emplace_front()
- 查找元素
front() //all back() //expect forward_list c[n] c.at(n) //ensure the index is valid
- 删除元素
pop与push对应; erase(iter); erase(iter1,iter2); clear() //delete all
- 改变容器的大小
resize() - 增删元素会改变容器的大小,因此可能会使迭代器出错。
- How a vector grow
- 容器(vector,string)实现保留多余的空间给新的元素,避免为添加元素重新分配新的空间给已有(existing)和新的元素。
capacity() //容器已占用空间和保留的空间 size() //容器已占用的空间 reserve(n) //设定容器的空间,使容器不必重新分配空间 shrink_to_fit() //减小空间至刚刚好,一般不用
- 适配器(Container Adaptors) : stack, queue, priority_queue