顺序容器 vector介绍
vector是C++STL库中表示数组大小可以改变的序列容器,使用连续的存储位置来存储元素,这意味着也可以使用只想元素的常规指针上的偏移量来访问元素(eg:a[i]),与数组不同的是,vector的大小可以动态变化,存储用容器来自动处理。
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.
在内部,vector使用动态分配的数组来存储它们的元素。这个数组可能需要重新分配,以便在插入新元素时增大大小,这意味着分配一个新数组并将所有元素移到该数组中。就处理时间而言,这是一项相对昂贵的任务,因此,vector不会在每次将元素添加到容器时重新分配。
相反,vector可以分配一些额外的存储以适应可能的增长,因此该容器的实际容量可能大于严格需要容纳其元素的存储容量(即其大小)。库可以实现不同的增长策略,以平衡内存使用和重新分配,但在任何情况下,重新分配只能以大小的对数增长间隔进行,以便在向量末尾插入单个元素时可以提供分摊的恒定时间复杂度。
因此,与阵列相比,向量消耗更多的内存,以换取高效地管理存储和动态增长的能力。
与其他动态序列容器(deques、list和forward\ u list)相比,vector非常有效地访问其元素(就像数组一样),并且相对有效地从其末端添加或删除元素。对于涉及在末端以外的位置插入或删除元素的操作,它们的性能比其他的容器差。
vector使用
使用vector,需在头文件中定义
#include <vector>
using namespace std; // vector属于std命名空间
vector初始化
vector<int> vec;
vector<int> vec(n); //大小为n的vector
vector<int> vec(n, x); // x个n
vector<int> b(vec); // 开一个vector名字为b的数组,并把vec的值复制给b
vector<int> b(vec.begin(), vec.end()); // 开一个vector名字为b的数组,并把vec的值复制给b
vector<int> b(&vec[0], &vec[1]); // 开一个vector名字为b的数组,并把vec[0], vec[1],的值复制给b
vector成员函数
a[i]; //直接访问a中第i个元素
a.at(i); // 得到编号位置的数据,直接访问a中第i个元素
a.empty(); //判断是否为空,是则返回true,否则返回false
a.size(); //返回a中的所存储元素的数量
a.push_back(x); //将x压入a的末尾
a.pop_back(); //将a的末尾元素出栈(返回值为void类型)
a.front(); //返回第一个元素, 得到数组头的引用
a.back(); // 得到数组的最后一个单元的引用
a.clear(); //清除a中所有的元素
a.insert(it,x); //在it前添加x
a.insert(it,n,x); //在it前添加n个x
a.max_size(); //返回vector的最大容量
a.capacity(); //返回a所能容纳的最大元素值
a.erase(it); //删除it这个迭代器所指向的值
a.erase(first,last); //删除从[first,last)的值
a.resize(n); //改变长度,超过的话则删除多余部分,少的话则增添默认值
a.resize(n,x); //同上,默认值改为x
a.clear(); //删除所有的元素
a.assign(first,last); //a中替换first,last,first到last这个区间的值不能为a
a.begin(); // 得到数组头的指针
a.end(); // 得到数组的最后一个单元+1的指针
a.rbegin(); // 将vector反转后的开始指针返回(其实就是原来的end-1)
a.rend(); // 将vector反转构的结束指针返回(其实就是原来的begin-1)
a.swap(); //与另一个vector交换数据
vector的迭代器
vector<int>::iterator it1; //正向迭代器
vector<int>::reverse_iterator it2; //反向迭代器
a.begin(); a.end(); //正向迭代器所用
a.rbegin(); a.rend(); //反向迭代器所用,rbegin()相当于end()-1,rend()相当于begin()+1
reverse(a.begin(),a.end()); //将a翻转
sort(a.begin(),a.end(),cmp); //排序,cmp处可以不写,默认为正向,也可以自己写排序的函数,默认有less<int>()和greater<int>()
vector查找指定元素并删除
查找时可以使用find函数,此时必须将algorithm头文件包含进去。
查找完成后,如果vector中包含该元素,则返回第一个元素,或者超出末端的下一个位置,返回的是迭代器。
删除元素之前,必须确保返回的