网上总结vector原理和用法的文章有很多,我也是在学习中逐渐摸索总结,希望能够和大家共同进步。
vector是STL标准模板库中的重要容器之一,可以通过设置来存放各种不同类型的数据,在STL中vector的实现方式是类模板,这些模板的参数允许我们指定容器中元素的数据类型,在结构上更加灵活,并且能够避免重复编码。
在工程中创建一个vector对象,在vector上右键转到定义,可以找到vector对应的实现代码。
template<class _Ty, class _Alloc = allocator<_Ty> > class vector : public _Vector_alloc<_Vec_base_types<_Ty, _Alloc> > { // varying size array of values public: typedef vector<_Ty, _Alloc> _Myt; ... }由于代码非常多,所以在这里只贴一小部分,能够看出,vector实际上是一个模板类,它通过类模板的形式来达到存储不同种数据的实现。也可以将其看做是存放某种数据类型的动态数组。
注意:这里的v1.begin()指向数组首个元素,但v1.end()并不是指向最后元素,而是指向最后一个元素的下一个,有点类似于字符串里的 ‘\0’ 。在执行vector<int> v4(v1.begin(), v1.end());的拷贝操作中,拷贝区间是左闭右开的,在之后的类似操作中也都是左闭右开。
v1.size()表示当前v1内的元素个数,v1.capacity()表示当前容器所能容纳的最大元素个数。当容器建立赋初值且未进行插入删除时,这两个值是相等的,但是进行向v1内添加元素的操作后,caplen就会大于len,这是因为初始化时分配的容器长度5已经不足以添加元素,所以要再开辟一块新的更大的空间(例如长度8)将前5个复制进去,再把第6个元素赋值为想添加的值。此时元素个数为6,但容器个数为8。这样做可以减少操作次数,节省资源。需要注意的是,当v1.capacity() > v1.size()时,不能通过v1[5]类似的方式直接调用或赋值给size()之外的值,多余空间是push_back用的,对于我们来说,只可知不可用。
//---调整长度--- vector<int> v1 = {1,2,3,4,5}; v1.resize(8); //v1的元素个数改为8个,大于原长度则补默认值0 v1.resize(3); //v1的元素个数改为3个,小于原长度则删除后面2个 v1.resize(8, 88); //v1的元素个数改为8,大于原长度则补设定值88 v1.resize(3, 88); //v1的元素个数改为3,小于原长度则删除后面2个 v1.reserve(15); //v1的元素个数仍为6个,但整体容器长度改为15个注:resize()函数改变的容器元素个数,即v1.size();reserve函数改变的是容器大小,即v1.capacity()。
1.数据添加
//---在末尾添加元素--- vector<int> v1 = {1,2,3,4,5}; v1.push_back(6); //在末尾添加元素,值为6 //---在数据中间插入元素--- vector<int> v2 = {6,7,8,9,10}; v1.insert(v1.begin() + 1, v2.begin(), v2.end());//在v1的第1个元素的前面插入v2 v1.insert(v1.begin() + 1, 5, 66); //在v1的第1个元素的前面插入5个66 v1.insert(v1.begin() + 1, 66); //在v1的第1个元素的前面插入66 v1.insert(v1.begin() + 1, { 6,7,8 }); //在v1的第1个元素的前面插入{6,7,8} //这里本来还应该有一个int && _Val的方式,以后学完C++11的特性再来补充2.数据删除
//---删除末尾元素--- vector<int> v1 = {1,2,3,4,5}; v1.pop_back(); //删除末尾元素5 //---删除中间元素--- v1.erase(v1.begin()+1); //删除第2个元素v1[1] v1.erase(v1.begin()+1, v1.begin()+3); //删除从第2个到第3个元素。注意!左开右闭! //---删除所有元素--- v1.clear(); //爽! //注意,执行clear后,v1.capacity()的值不变!3.数据的单独查询和改动
//---查找容器内是否包含某一元素--- vector<int> v1 = {1,2,3,4,5}; bool isFind = count(v1.begin(), v1.end(), 3);//在v1内查找3是否存在,是则返回1 //---下标操作--- int num1 = v1[3]; v1[3] = 6; //---at函数--- int num2 = v1.at(3); v1.at(3) = 6; //---首位接口--- int num3 = v1.front(); //v1的首元素 int num4 = v1.back(); //v1的末元素 v1.front() = 6; //v1的首元素更改为6 v1.back() = 6; //v1的末元素更改为64.数据的依次查询或改动
//---通过循环--- vector<int> v1 = {1,2,3,4,5}; for(int i = 0; i < v1.size(); i++) { cout << "第" << i << "个元素的值为:" << v1[i] << endl; //读取 v1[i] = 5; //赋值 } //---通过迭代器--- vector<int>::iterator iter = v1.begin(); for(; iter != v1.end(); iter++) { cout << *iter << endl; //读取 *iter = 5; //赋值 }其中,sort函数在我的其它文里有介绍,在这里不过多说明。以上就是我总结的内容,以后在学习过程中遇到新的东西会继续更新,希望大家批评指正!
链接: C++STL标准模板库之容器deque.
. 我是没信号的法杖,无法发送信号,也无法接受信号。