欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 详解vector容器

详解vector容器

2025/11/5 14:00:55 来源:https://blog.csdn.net/2401_82757880/article/details/143779405  浏览:    关键词:详解vector容器

        碎碎念:一开始额刚会用vector的时候我真是发现不咋好用哈哈哈哈,没数组直白,后面我有一次写算法题,一直过不了,最后是因为我数组开大了,于是我就开始vector之路······

        切入正题:

接下来我会给大家详细介绍:

目录

part1:vector的简介

part2:vector的使用

1.vector的定义

2.vector的初始化

(1)vector v={1,2,3,4,5};        //不初始化

(2)vector v(n);        //创建长度为n的vector

(3)vector v(n,x);        //创建长度为n初始值为x的vector

(4)vector v(a.begin(),a.end())        //创建一个与a容器相同的vector

(5)vector v=a;        //a是容器,创建一个与a相同的容器v

(6)vector v(a.begin(),a.begin()+3);        //给v初始化成a容器的第一个元素—a容器的第4个元素

(7)输入法

具体实现代码:

运行结果:

3. 赋值操作 

(1)v.assign(a.begin(),a.end());        //把函数a中元素复制到v中(初始化操作中的6也可执行这样的操作)

(2)v.assign(10,'a');        //v的前十个值赋成字符a

具体演示:

运行结果:

4.插入和删除操作

(1)功能描述:对vector容器进行插入、删除操作。

(2)函数原型:

(3)具体实现代码:

(4)运行结果:

5. 数据存取

(1)功能描述:对vector中的数据进行存取操作。

(2)函数原型:

(3)除了用迭代器获取vector容器中元素,[]和at也可以。

(4) 运行结果:

6. 交换操作

(1)功能描述:实现两个容器内元素进行互换。

(2) 函数原型:

(3)swap可以使两个容器互换,可以达到实用的收缩内存效果。

7. vector 容量和大小

(1) 功能描述: 对 vector 容器的容量和大小操作

(2) 函数原型:

(3) 具体实现代码 

(4)运行结果:

8.预留空间操作——reserve函数用法

(1)功能:减少vector在动态扩容的扩展次数

(2)函数原型:

(3)具体代码:

最后补充点遍历的知识:



part1:vector的简介

本质上vector是一个可以动态扩展的数组。

他有一个别称:单端数组。

(1)vector与数组的区别

        数组是静态空间的,vector容器是支持动态扩展的。

(2)vector误区

        但我们在对vector进行动态规划的时候,可能就觉得是在原本的内存空间后面加上新的内存空间,但实际上不是的,而是找到一个内存空间更大的地方,把原来的数据拷贝进去,原来的内存空间将被清空。

(3)vector迭代器

        vector迭代器是支持随机访问的迭代器。

part2:vector的使用

1.vector的定义

        vector<T> v;         T是数据类型

2.vector的初始化

(1)vector<T> v={1,2,3,4,5};        //不初始化

(2)vector<T> v(n);        //创建长度为n的vector

(3)vector<T> v(n,x);        //创建长度为n初始值为x的vector

(4)vector<T> v(a.begin(),a.end())        //创建一个与a容器相同的vector

(5)vector<T> v=a;        //a是容器,创建一个与a相同的容器v

(6)vector<T> v(a.begin(),a.begin()+3);        //给v初始化成a容器的第一个元素—a容器的第4个元素

(7)输入法

具体实现代码:

#include <iostream>
#include <vector>using namespace std;int main(void){cout<<"方式一"<<endl;vector<int> v1={1,2,3,4,5};for(auto i=v1.begin();i!=v1.end();i++){cout<<*i<<" ";} cout<<endl;cout<<"-------------------"<<endl<<endl;cout<<"方式二"<<endl;vector<int> v2(5);//验证cout<<"v2的长度是:"<<v2.size()<<endl; cout<<"-------------------"<<endl<<endl;cout<<"方式三"<<endl;vector<int> v3(2,3);//验证for(auto i=v3.begin();i!=v3.end();i++){cout<<*i<<" ";} cout<<endl;cout<<"-------------------"<<endl<<endl;cout<<"方式四"<<endl;vector<int> a1={1,2,3,4,5};vector<int> v4(a1.begin(),a1.end());for(auto i=v4.begin();i!=v4.end();i++){cout<<*i<<" ";} cout<<endl;cout<<"-------------------"<<endl<<endl;cout<<"方式五"<<endl;vector<int> a2={1,2,3,4,5};vector<int> v5=a2;for(auto i=v5.begin();i!=v5.end();i++){cout<<*i<<" ";} cout<<endl;cout<<"-------------------"<<endl<<endl;cout<<"方式六"<<endl;vector<int> a3={1,2,3,4,5};vector<int> v6(a3.begin(),a3.begin()+3);for(auto i=v6.begin();i!=v6.end();i++){cout<<*i<<" ";} cout<<endl;cout<<"-------------------"<<endl<<endl;cout<<"方式七"<<endl;vector<int> v7;int n=5,x;for(int i=0;i<n;i++){cin>>x;v7.push_back(x);} for(auto i=v7.begin();i!=v7.end();i++){cout<<*i<<" ";} cout<<endl;cout<<"-------------------"<<endl<<endl;return 0;
}

运行结果:

3. 赋值操作 

(1)v.assign(a.begin(),a.end());        //把函数a中元素复制到v中(初始化操作中的6也可执行这样的操作)

(2)v.assign(10,'a');        //v的前十个值赋成字符a

具体演示:

#include <iostream>
#include <vector>using namespace std;int main(void){cout<<"方式一"<<endl;vector<int> a={1,2,3,4,5};vector<int> v1{6,7,8,9,10};//赋值之前 for(auto i=v1.begin();i!=v1.end();i++){cout<<*i<<" ";} cout<<endl;//赋值之后v1.assign(a.begin(),a.end());for(auto i=v1.begin();i!=v1.end();i++){cout<<*i<<" ";} cout<<endl;cout<<"-------------------"<<endl<<endl;cout<<"方式二"<<endl;vector<char> v2(10,'a');for(auto i=v2.begin();i!=v2.end();i++){cout<<*i<<" ";} cout<<endl;v2.assign(10,'b');for(auto i=v2.begin();i!=v2.end();i++){cout<<*i<<" ";} cout<<endl;cout<<"-------------------"<<endl<<endl;return 0;
}

运行结果:

4.插入和删除操作

(1)功能描述:对vector容器进行插入、删除操作。


(2)函数原型:

1. push_back(ele);  //尾部插入元素ele
2. pop_back();  //删除最后一个元素
3. insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
4. insert(const_iterator pos, int count ele); //迭代器指向位置pos插入count个元素
5. erase(const_iterator pos); //删除迭代器指向的元素
6. erase(cons_titerator start, const_iterator end);  //删除迭代器从start到end之间的元素
7. clear();  //删除容器中所有元素

(3)具体实现代码:

#include <iostream>
#include <vector> using namespace std;void printVector(vector<int>v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;}void test04()
{vector<int> v1;//尾插v1.push_back(10);v1.push_back(20);v1.push_back(30);v1.push_back(40);v1.push_back(50);//遍历printVector(v1);//尾删v1.pop_back();printVector(v1);//插入   参数是迭代器v1.insert(v1.begin(), 100);printVector(v1);//删除  参数也是迭代器v1.insert(v1.begin(),2,999);printVector(v1);//删除v1.erase(v1.begin());printVector(v1);//清空  方式一:v1.erase(v1.begin(), v1.end());printVector(v1);//清空  方式二:v1.clear();printVector(v1);
}int main()
{test04();return 0;
}

(4)运行结果:

5. 数据存取

(1)功能描述:对vector中的数据进行存取操作。


(2)函数原型:

1. at(int idx);   ///返回索引为idx所指的数据。
2. operator[];  //返回索引idx所指的数据。
3. front();  //返回容器中第一个数据元素
4. back();   //返回容器中最后一个数据元素。

(3)除了用迭代器获取vector容器中元素,[]和at也可以。

#include <iostream>
#include<vector> using namespace std;void printVector(vector<int> v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}void test05()
{vector<int> v1;for (int i = 0; i < 10; i++){v1.push_back(i);}//利用[]方式访问数组中元素for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//利用at方式访问元素for (int i = 0; i < v1.size(); i++){cout << v1.at(i) << " ";}cout << endl;//获取第一个元素cout << "第一个元素为:" << v1.front() << endl;//获取最后一个元素cout << "最后一个元素为:" << v1.back() << endl;
}int main()
{test05();return 0;
}

(4) 运行结果:

6. 交换操作

(1)功能描述:实现两个容器内元素进行互换。


(2) 函数原型:

1. swap(vec);  //将vec与本身的元素互换

(3)swap可以使两个容器互换,可以达到实用的收缩内存效果。

7. vector 容量和大小

(1) 功能描述: 对 vector 容器的容量和大小操作

(2) 函数原型:

(1)empty();         判断容器是否为空(2)capacity();         容器的容量(3)size();         返回容器中元素的个数(4)resize(int num);        1)重新指定容器的长度为num,若容器变长,则以默认值填充新位置 (默认填充0)2)如果容器变短,则末尾超出容器长度的元素被删除(5)resize(int num, elem);1)重新指定容器的长度为num,若容器变长,则以elem值填充新位置2)如果容器变短,则末尾超出容器长度的元素被删除

(3) 具体实现代码 

#include <iostream>
#include <vector>using namespace std;void Printf(vector<int>& v){for(vector<int>::iterator it=v.begin();it!=v.end();it++){cout<<*it<<" ";}cout<<endl;
} int main(void){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);//	1.empty()为真,代表容器是空的 if(v.empty()){cout<<"v容器是空的"<<endl;}else{cout<<"v容器不是空的"<<endl; }//	2.capacity()返回的是容器的容量cout<<"v容器的容量为:"<<v.capacity()<<endl;//	3.size()返回的是容器的元素个数 cout<<"v容器的元素个数是:"<<v.size()<<endl; //	4.resize()重新指定容器大小;
//	如果指定容器的大小比实际容器的大小大,那么他将会把少的部分用0填充
//	如果指定的容器的大小比实际容器大小小,那么他将会把多余的部分删去 v.resize(6); Printf(v);v.push_back(5);v.push_back(6);v.push_back(7);Printf(v);v.resize(6);Printf(v);v.resize(3,6);
//	如果指定的容器的大小比实际容器大小小,那么他将会把多余的部分删去 	Printf(v);v.resize(6,4);//	如果指定容器的大小比实际容器的大小大,那么他将会把少的部分用4填充Printf(v);return 0;
}

(4)运行结果:

8.预留空间操作——reserve函数用法

(1)功能:减少vector在动态扩容的扩展次数

每次使用push_back(v)时,如果容器v的大小要超过v的容量时,系统就会对v进行一次动态扩容,至于扩大多少空间,由系统决定

(2)函数原型:

reserve(int len);//容器预留len个元素长度,也就是把容量扩为len,
预留的位置并不初始化,同时也不可访问。

(3)具体代码:

void text08()
{vector<int> v1,v2;v2.reserve(10000);//给v2设置预留空间,v1不设置//对比v1,v2,系统需要动态扩容多少次int num1 = 0;       //扩容次数int num2 = 0;       int capacity1 = 0;  //容量大小int capacity2 = 0;for (int i = 0; i < 10000; ++i){v1.push_back(i);if (capacity1 != v1.capacity())//计算扩容次数,当容量不相等时,证明系统扩容了{capacity1 = v1.capacity();++num1;}v2.push_back(i);if (capacity2 != v2.capacity()){capacity2 = v2.capacity();++num2;}}cout << "系统对v1扩容" << num1 << "次" << endl;cout << "系统对v2扩容" << num2 << "次" << endl;
}

最后补充点遍历的知识:

遍历的方式:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;void func(int i){cout<<i<<" ";
}int main(void){cout<<"第一种方式"<<endl;vector<int> v={1,3,5,7,9};for(vector<int>::iterator it=v.begin();it!=v.end();it++){cout<<*it<<" ";}cout<<endl;cout<<"---------------------"<<endl;cout<<"第二种方式"<<endl; for(auto it=v.begin();it!=v.end();it++){cout<<*it<<" ";}cout<<endl;cout<<"---------------------"<<endl;cout<<"第三种方式"<<endl;for(int &i:v){cout<<i<<" ";} cout<<endl;cout<<"---------------------"<<endl;cout<<"第四种方式"<<endl;for(int i:v){		//int用auto也可以 cout<<i<<" ";} cout<<endl;for(auto i:v){	cout<<i<<" ";} cout<<endl;cout<<"---------------------"<<endl;cout<<"第五种方式"<<endl;for_each(v.begin(),v.end(),func);	//这个必须要加上#include <algorithm>头文件 cout<<endl;cout<<"---------------------"<<endl;return 0;
}


原文链接:https://blog.csdn.net/qq_52324409/article/details/121000029
原文链接:https://blog.csdn.net/qq_45138120/article/details/129969308

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词