#include <iostream>
#include <vector>
using namespace std;
/**
*@NWNU ziyif
*/
//vector也称为单端数组,它可以 动态扩展:并不是在原空间续接新空间,而是找更大的内存空间,然后将原数据copy到新空间,释放原空间
//vector的迭代器是支持随机访问的迭代器
//vector中的数据只能从尾部压入数据和弹出数据(类似栈),头部封着
void PrintVector(vector<int> &v);///引用的方式
void try1();//vector的容器构造
void try2();//vector的赋值操作
void try3();//vector的容量与大小
void try4();//vector的插入与删除
void try5();//vector数据存取
void try6();//vector互换容器(两个容器中元素的互换)
void try7();//vector预留空间(减少vector在动态扩展容量时的扩展次数)
int main()
{
try7();
return 0;
}
void PrintVector(vector<int> &v){
for(vector<int>::iterator it=v.begin();it<v.end();it++){//迭代器输出
cout<<*it<<" ";
}
cout<<endl;
}
void try1(){
vector<int> v1;///默认构造 无参构造
for(int i=0;i<10;i++){
v1.push_back(i);
}
PrintVector(v1);
//通过区间的方式进行构造,注意不要加=
vector<int> v2(v1.begin(),v1.end());//v1.begin()到v1.end()区间,左开右闭,v.end()对应的数据取不到
PrintVector(v2);
//n个elem构造,注意不要加=
vector<int>v3(10,100);
PrintVector(v3);
///copy构造,注意不要加=
vector<int>v4(v3);
PrintVector(v4);
}
void try2(){
vector<int>v1;
for(int i=0;i<10;i++){
v1.push_back(i);
}
PrintVector(v1);
//等号赋值
vector<int>v2=v1;
PrintVector(v2);
//assign
vector<int>v3;
v3.assign(v1.begin(),v1.end());//v1.begin()到v1.end()区间,左开右闭,v.end()对应的数据取不到
PrintVector(v3);
//n个elem赋值
vector<int>v4;
v4.assign(10,100);
PrintVector(v4);
}
void try3(){
vector<int>v1;
for(int i=0;i<10;i++){
v1.push_back(i);
}
PrintVector(v1);
if(v1.empty()){//为真,v1空
cout<<"empty"<<endl;
}
else{
cout<<"noempty"<<endl;
cout<<"v1的容量为:"<<v1.capacity()<<endl;
cout<<"v1的size为:"<<v1.size()<<endl;
}
//resize
v1.resize(15);//默认填充值为0
PrintVector(v1);
v1.resize(6);//超出部分会删除
PrintVector(v1);
v1.resize(15,1);//利用重载版本,可以指定默认填充值
PrintVector(v1);
}
void try4(){
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);
//insert
v1.insert(v1.begin(),100);//使用迭代器进行插入(第一个参数是迭代器)
PrintVector(v1);
v1.insert(v1.begin(),2,1000);//使用迭代器进行插入(第一个参数是迭代器),2个1000
PrintVector(v1);
//delete
v1.erase(v1.begin());//参数为迭代器
PrintVector(v1);
//clear
v1.erase(v1.begin(),v1.end());
PrintVector(v1);
v1.clear();
}
void try5(){
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<<"first="<<v1.front()<<endl;
//访问最后一个元素
cout<<"last="<<v1.back()<<endl;
}
void try6(){
vector<int>v1;
for(int i=0;i<10;i++){
v1.push_back(i);
}
cout<<"BeforeSwap"<<endl;
PrintVector(v1);
vector<int>v2;
for(int i=10;i>0;i--){
v2.push_back(i);
}
PrintVector(v2);
cout<<"AfterSwap"<<endl;
v1.swap(v2);
PrintVector(v1);
PrintVector(v2);
//巧用swap可以搜索内存空间
vector<int>v3;
for(int i=0;i<10000;i++){
v3.push_back(i);
}
cout<<"v3.capacity()="<<v3.capacity()<<endl;
cout<<"v3.size()="<<v3.size()<<endl;
//重新定义空间
v3.resize(3);
cout<<"v3.capacity()="<<v3.capacity()<<endl;
cout<<"v3.size()="<<v3.size()<<endl;
//巧用swap收缩内存
vector<int>(v3).swap(v3);//vector<int>(v3):利用v3来创建一个新的匿名对象(当前行执行完之后会被系统回收),
//利用v3目前所用的元素个数来初始化这个匿名对象的大小
//.swap(v3):容器的交换,v3指向匿名对象的,匿名对象指向v3的,执行完这一句之后,匿名对象指向的容器会被回收
cout<<"v3.capacity()="<<v3.capacity()<<endl;
cout<<"v3.size()="<<v3.size()<<endl;
}
void try7(){
vector<int>v1;
//利用reserve预留空间
v1.reserve(10000);//容器预留10000个元素长度,但是预留位置不初始化,元素不能被访问
int num=0;
int *p=NULL;
for(int i=0;i<10000;i++){
v1.push_back(i);
if(p!=&v1[0]){
p=&v1[0];
num++;
}
}
cout<<num<<endl;
}
vector容器
最新推荐文章于 2024-07-15 13:32:43 发布