1. 程式人生 > 實用技巧 >這麼美的“vector容器”,你確定你不看嗎?

這麼美的“vector容器”,你確定你不看嗎?

內容思維導圖:

一、vector基本概念:

1、功能:

vector資料結構和陣列非常相似,也稱為單端陣列。

2、vector和普通陣列的區別:

不同之處在於陣列是靜態空間,而vector是可以動態擴充套件的。動態擴充套件它並不是在原空間之後持續新空間,而是找更大的記憶體空間,然後將原資料拷貝到新空間,釋放原空間。

注:上圖中的push_back()和pop_back()函式分別表示往容器裡面插入資料和從容器中拿走資料;begin()和end()是我們稍後會用到的迭代器

3、vector容器的迭代器是支援隨機訪問的迭代器。

二、vector建構函式

1、功能:

建立vector容器

2、函式原型:

vector v;//採用模板實現類,預設建構函式

vector(v.begin(),v.end());//將v[begin(),end())區間中的元素拷貝給本身,注意是左閉右開

vector(n,elem);//建構函式n個elem拷貝給本身

vector(const vector &vec);//拷貝建構函式

程式碼應用:

#include<iostream>
#include<vector>
usingnamespacestd;
//輸出列印
voidprint(vector<int>&v)
{
for(vector<int>::iteratorit=v.begin();it!=v.end();it++)
{
cout<<*it<<"";
}
cout<<endl;
}
//vector容器構造
voidtest()
{
vector<int>v1;

for(inti=0;i<10;i++)
{
v1.push_back(i);
}
print(v1);
//通過區間方式進行構造
vector<int>v2(v1.begin(),v1.end());
print(v2);
//n個elem方式構造
vector<int>v3(10,100);
print(v3);
//拷貝構造
vector<int>v4(v3);
print(v4);

}
intmain()
{
test();
}

結果輸出:

root@txp-virtual-machine:/home/txp/test2#./a.out
0123456789
0123456789
100100100100100100100100100100
100100100100100100100100100100

三、vector賦值操作:

1、功能描述:

給vector容器進行賦值

2、函式原型:

vector& operator=(const vector &vec);//過載等號操作符

assign(beg,end);//將[beg,end)區間中的資料拷貝賦值給本身

assign(n,elem);//將n個elem拷貝賦值給本身

程式碼應用:

#include<iostream>
#include<vector>
usingnamespacestd;

voidprint(vector<int>&v)
{
for(vector<int>::iteratorit=v.begin();it!=v.end();it++)
{
cout<<*it<<"";
}
cout<<endl;
}
voidtest()
{
vector<int>v1;

for(inti=0;i<10;i++)
{
v1.push_back(i);
}
print(v1);
//賦值操作
vector<int>v2;
v2=v1;
print(v2);
//assign()
vector<int>v3;
v3.assign(v1.begin(),v1.end());
print(v3);
//n個elem方式賦值
vector<int>v4;
v4.assign(10,100);
print(v4);


}
intmain()
{
test();
}

結果輸出:

root@txp-virtual-machine:/home/txp/test2#./a.out
0123456789
0123456789
0123456789
100100100100100100100100100100

四、vector容量和大小:

1、功能描述:

對vector容器的容量和大小進行操作

2、函式原型:

empty();//判斷容器是否為空

capacity();//容器的容量

size();//返回容器中的元素個數

resize(int num);//重新指定容器的長度為num,若容器變長,則以預設值填充新位置;如果容器變短,則末尾超出容器長度的元素被刪除

resize(int num, eles);

程式碼應用:

#include<iostream>
#include<vector>
usingnamespacestd;

voidprint(vector<int>&v)
{
for(vector<int>::iteratorit=v.begin();it!=v.end();it++)
{
cout<<*it<<"";
}
cout<<endl;
}
voidtest()
{
vector<int>v1;

for(inti=0;i<10;i++)
{
v1.push_back(i);
}
print(v1);
//判斷容器是否為空
if(v1.empty())
{
cout<<"v1isempty"<<endl;
}
else
{
cout<<"v1isnotempty"<<endl;
cout<<"v1'scapacityis:"<<v1.capacity()<<endl;
cout<<"v1'ssizeis:"<<v1.size()<<endl;
}
v1.resize(15);
print(v1);
v1.resize(15,100);//利用過載版本,可以指定預設填充,引數2,如果重新指定的比原來的長了,預設用0填充新的位置
print(v1);

v1.resize(5);//如果重新指定的比原來短了,超出部分會被刪除掉
print(v1);
}
intmain()
{
test();
}

結果輸出:

root@txp-virtual-machine:/home/txp/test2#./a.out
0123456789
v1isnotempty
v1'scapacityis:16
v1'ssizeis:10
012345678900000
012345678900000
01234

五、vector插入和刪除:

1、功能描述: 對vector容器進行插入和刪除操作

2、函式原型:

push_back();//尾部插入元素

pop_back();//刪除最後一個元素
insert(const_iterator pos,ele);//迭代器指向位置pos插入元素els

erase(const_iterator pos);//刪除迭代器指向的元素
erase(const_iterator start,const_iteartor end);//刪除迭代器從start到end之間的元素
clear();//刪除容器中所有元素 程式碼應用:

#include<iostream>
#include<vector>
usingnamespacestd;
voidprint(vector<int>&v)
{
for(vector<int>::iteratorit=v.begin();it!=v.end();it++)
{
cout<<*it<<"";
}
cout<<endl;
}
voidtest()
{
vector<int>v1;
//尾插
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);

print(v1);
//尾刪
v1.pop_back();
print(v1);
//插入,第一個引數是迭代器
v1.insert(v1.begin(),100);
print(v1);

v1.insert(v1.begin(),2,1000);
print(v1);
//刪除
v1.erase(v1.begin());
print(v1);
//清空
v1.clear();
print(v1);
}
intmain()
{
test();
}

                                   結果輸出:
root@txp-virtual-machine:/home/txp/test2#./a.out
1020304050
10203040
10010203040
1000100010010203040
100010010203040


六、vector資料存取:

1、功能描述:

對vector中的資料進行存取操作

2、函式原型:

at(int idx);//返回索引idx所指的資料

operator[];//返回索引idx所指的資料

front();//返回容器中第一個資料元素

back();//返回容器中最後一個數據元素

程式碼應用:

#include<iostream>
#include<vector>
usingnamespacestd;
/*voidprint(vector<int>&v)
{
for(vector<int>::iteratorit=v.begin();it!=v.end();it++)
{
cout<<*it<<"";
}
cout<<endl;
}*/
voidtest()
{
vector<int>v1;
for(inti=0;i<10;i++)
{
v1.push_back(i);
}
for(inti=0;i<10;i++)
{
cout<<v1[i]<<"";
}
cout<<endl;
for(inti=0;i<v1.size();i++)
{
cout<<v1.at(i)<<"";
}
cout<<endl;

cout<<"thefirstelemtis:"<<v1.front()<<endl;
cout<<"thelastelemtis:"<<v1.back()<<endl;
}
intmain()
{
test();
}

結果輸出:

root@txp-virtual-machine:/home/txp/test2#./a.out
0123456789
0123456789
thefirstelemtis:0
thelastelemtis:9

                                   七、vector互換容器:
                                  1、功能描述:
                                    實現兩個容器內元素進行互換          
                                    2、函式原型:          
                                    swap(vec);;//將vec與本身的元素互換          

程式碼應用:

#include<iostream>
#include<vector>
usingnamespacestd;
voidprint(vector<int>&v)
{
for(vector<int>::iteratorit=v.begin();it!=v.end();it++)
{
cout<<*it<<"";
}
cout<<endl;
}
voidtest()
{
vector<int>v1;
for(inti=0;i<10;i++)
{
v1.push_back(i);
}
print(v1);

vector<int>v2;
for(inti=10;i>0;i--)
{
v2.push_back(i);
}
print(v2);

cout<<"afterswap()"<<endl;
v1.swap(v2);
print(v1);
print(v2);
}
intmain()
{
test();
}

結果輸出:

root@txp-virtual-machine:/home/txp/test2#./a.out
0123456789
10987654321
afterswap()
10987654321
0123456789

利用swap進行收縮記憶體空間

#include<iostream>
#include<vector>
usingnamespacestd;
/*voidprint(vector<int>&v)
{
for(vector<int>::iteratorit=v.begin();it!=v.end();it++)
{
cout<<*it<<"";
}
cout<<endl;
}*/
voidtest()
{
vector<int>v1;
for(inti=0;i<10000;i++)
{
v1.push_back(i);
}
cout<<"vcapacityis:"<<v1.capacity()<<endl;
cout<<"vsizeis:"<<v1.size()<<endl;

v1.resize(3);
cout<<"vcapacityis:"<<v1.capacity()<<endl;
cout<<"vsizeis:"<<v1.size()<<endl;

vector<int>(v1).swap(v1);
cout<<"vcapacityis:"<<v1.capacity()<<endl;
cout<<"vsizeis:"<<v1.size()<<endl;

}
intmain()
{
test();
}

結果輸出:

root@txp-virtual-machine:/home/txp/test2#./a.out
vcapacityis:16384
vsizeis:10000
vcapacityis:16384
vsizeis:3
vcapacityis:3
vsizeis:3

八、vector預留空間:

1、功能描述:

減少vector在動態擴充套件容量時的擴充套件次數

2、函式原型:

reserve(int len);//容器預留len個元素長度,預留位置不初始化,元素不可訪問 程式碼應用:

#include<iostream>
#include<vector>
usingnamespacestd;
/*voidprint(vector<int>&v)
{
for(vector<int>::iteratorit=v.begin();it!=v.end();it++)
{
cout<<*it<<"";
}
cout<<endl;
}*/
voidtest()
{
vector<int>v1;
intnum=0;//統計開闢次數
int*p=NULL;
for(inti=0;i<10000;i++)
{
v1.push_back(i);
if(p!=&v1[0])
{
p=&v1[0];
num++;
}
}
cout<<"num="<<num<<endl;
}
intmain()
{
test();
}

結果輸出:

root@txp-virtual-machine:/home/txp/test2#./a.out
num=15


我是txp,一個只專注於乾貨分享的博主,歡迎隨時來撩我,我們下期見!更多精彩內容,可以微信搜尋:txp玩linux