0.前言
在讲解vector之前,先简单的介绍下STL。
C++ STL是(Standard Template Library标准模板库)是通用类模板和算法的结合,它提供给程序员一些标准的数据结构的实现如queue(队列),list(链表),和stacks(栈)等。
C++ STL提供了三类数据结构的实现:
(1)顺序容器
vector 从后面快读的插入和删除,直接访问任何元素
deque 从前面或后面快速的插入和删除,直接访问任何元素
list 双链表,从任何地方快递的插入与删除
(2)关联容器
set 快速查找,不允许重复值
multiset 快速查找,允许重复值
map 一对多映射,基于关键字快速查找,不允许重复值
multimap 一对多映射,基于关键字快速查找,允许重复值
(3)容器适配器
stack 后进先出
queue 先进先出
priority_queue 最高优先级元素总是第一个出列
1、C++ Vector(向量容器)
是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector看作动态数组。
在创建一个vector后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始空间的大小可以预先指定也可以由vector默认指定,这个大小即capacity()函数的返回值。当存储的数据超过分配的空间时,vector会重新分配一块内存,但这样的分配是很耗时的,在重新分配的内存空间时它会做如下的动作:
首先,vector会申请一块更大的内存块;
然后,将原来的数据拷贝到新的内存块中;
其次,销毁掉原内存块中的对象(调用对象的析构函数);
最后,将原来的内存空间释放掉。
如果vector保存的数据量很大时,这样的操作一定会导致槽糕的性能(这也是vector被设计成比较容易拷贝的值类型的原因)。所以说,vector不是在什么情况下性能都好,只有预先知道它大小的情况下vector的性能才是最优的。
2、vector的特点:
(1)指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back() 和pop_back()。
(2)随机访问方便,它像数组一样被访问,即支持[ ]操作符和vector.at()。
(3)节省空间,因为它是连续存储,在存储数据的区域都没有被浪费的,但是要明确一点vector大多数情况下都是为存满的,在未存储的区域实际是浪费的。
(4)在内部进行插入、删除效率非常低,这样的操作基本上是被禁止的。vector被设计成只能在尾部进行追加和删除操作,其原因是vector内部的实现是按照顺序表的原理。
(5)只能在vector的最后进行push和pop,不能在vector的头部进行push和pop。
Vector包含着一系列连续存储的元素,其行为和数组类似。访问vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所在的位置或是在vector中插入元素则是线性时间复杂度。
3、vector的成员函数:
(1)Constructors构造函数
vector<int> v1; //构造一个空的vector
vector<int> v2(5, 42); //构造了一个包含5个值为42的元素的vector
(2)Operators 对vector进行赋值或比较
C++ Vector能够使用标准运算符:==,!=,<=,>=,< 和 >
要访问vector中的某特定位置的元素可以使用 [] 操作符
两个vector被认为是相等的,如果:
1、他们具有相同的容量
2、所有相同位置的元素相等
(3)assign()对vector中的元素进行赋值
void assign(input_iterator start, input_iterator end);
//将区间[start, end)的元素赋值到当前vector
void assign(size_type num, const TYPE &val);
//赋num个值为val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容
(4)at() 返回指定位置的元素
(5)back() 返回最末一个元素
(6)begin() 返回第一个元素的迭代器
(7)capacity() 返回vector()所能容纳的元素数量(在不重新分配内存的情况下)
(8)clear() 清空所以元素
(9)empty() 判断vector是否为空(返回true时为空)
(10)end() 返回最末元素的迭代器(实指向最末元素的下一个位置)
(11)erase() 删除指定元素
iterator erase(iterator loc); //删除loc处的元素
iterator erase(iterator start, iterator end); //删除start和end之间的元素
(12)front() 返回第一个元素的引用
(13)get_allocator() 返回vector的内存分配器
(14)insert() 插入元素到vector中
iterator insert(iterator loc, const TYPE &val);
//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
void insert(iterator loc, size_type num, const TYPE &val);
//在指定位置loc前插入num个值为val的元素
void insert(iterator loc, input_iterator start, input_iterator end);
//在指定位置loc前插入区间[start, end)的所有元素
(15)max_size() 返回vector所能容纳元素的最大数量(上限)
(16)pop_back() 移除最后一个元素
(17)push_back() 在vector最后添加一个元素
(18)rbegin() 返回vector尾部的逆迭代器
(19)rend() 返回vector起始的逆迭代器
(20)reserve() 设置vector最小的元素容纳数量
(21)resize() 改变vector元素数量的大小
语法:void resize(size_type size, TYPE val);//改变当前vector的大小为size,且对新创建的的元素赋值
(22)size()返回vector元素数量的大小
(23)swap() 交换两个vector
语法:void swap(vector &from);
解释:
capacity():指的是在不重新分配内存下,当前已经分配的可以容纳的元素的个数。
size():指的是当前元素个数(即当前的vector已经存了多少个元素的数量)。
max_size():指的是vector最大的可能的元素保存个数。