碎碎念:一开始额刚会用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
