1、vector的作用
vector是最常用的容器之一,功能十分強(qiáng)大,可以儲(chǔ)存、管理各種類型的數(shù)據(jù)。在很多情況下可以用來(lái)代替功能比較局限的普通數(shù)組,因?yàn)槲覀冎?,普通?shù)組只能實(shí)現(xiàn)一對(duì)一的映射而不能實(shí)現(xiàn)一對(duì)多的映射,vector就是專門為了解決這個(gè)問(wèn)題而誕生的。vector也可以稱為動(dòng)態(tài)數(shù)組,因?yàn)槠浯笮∈歉鶕?jù)實(shí)時(shí)更新而變化的,正因?yàn)槿绱藇ector顯得更加靈活易用。
舉個(gè)例子
小明擁有一根香蕉和兩個(gè)蘋果
小芳擁有一根棒棒糖個(gè)三個(gè)梨
那么你試著思考一下,應(yīng)當(dāng)如何在程序中表示這種結(jié)構(gòu)呢?這就是一對(duì)多映射的例子,學(xué)完vector就可以輕松解決這個(gè)問(wèn)題了。
2、vector的定義
vector<儲(chǔ)存的類型> 容器名
如:
儲(chǔ)存int型的值 vector<int> v;
儲(chǔ)存double型的值 vector<double> v;
儲(chǔ)存string型的值 vector<string> v;
儲(chǔ)存結(jié)構(gòu)體或者類的值的值 vector<結(jié)構(gòu)體名> v;
當(dāng)然也可以定義vector數(shù)組:
儲(chǔ)存int型的值 vector<int> v[n];
儲(chǔ)存double型的值 vector<double> v[n];
等等,n為數(shù)組的大小
3、vector常用的成員函數(shù)
//這些都是必會(huì)的成員函數(shù)
size()//返回返回容器中元素個(gè)數(shù)
begin()//返回頭部迭代器
end()//返回尾部+1迭代器
rbegin()//返回逆首部迭代器
rend()//返回逆尾部-1迭代器
front()//返回首個(gè)元素
back()//返回尾部元素
push_back()//在末尾添加一個(gè)元素
emplace_back()//和push_back()是一樣的作用
pop_back()//彈出最后一個(gè)元素
empty()//判斷是否為空
insert()//在指定位置插入元素
erase()//在指定位置刪除元素
clear()//清空容器
詳細(xì)解析:
(1)size()
size()是最常用的成員函數(shù)了,常用于vector的遍歷和元素個(gè)數(shù)的查詢
(2)push_back()
除了初始化以外,push_back()是vector最重要的修改函數(shù)了,復(fù)雜度為O(1),而insert()的復(fù)雜度為O(n),差距明顯
(3)front()、back()
查詢首元素和未元素,其實(shí)通過(guò)隨機(jī)訪問(wèn),v[0]、v[v.size()-1]是可以達(dá)到相同效果的,用front()和back()顯得專業(yè)點(diǎn)
(4)begin()、end()
通常用來(lái)方便排序的,也可以用來(lái)遍歷,但沒(méi)必要,通過(guò)下標(biāo)遍歷更簡(jiǎn)單快捷,rbegin()、rend()則可以用來(lái)逆序排序
(5)insert()
insert (position, x );
insert (position, n, x );
insert (position, first, last );
插入新的元素,
第一個(gè)函數(shù),在迭代器指定的位置前插入值為x的元素
第二個(gè)函數(shù),在迭代器指定的位置前插入n個(gè)值為x的元素
第三個(gè)函數(shù),在迭代器指定的位置前插入另外一個(gè)容器的一段序列迭代器first到last
復(fù)雜度很高,迫不得已不使用
(6)erase()
erase ( position );
erase (first, last );
刪除元素或一段序列
同樣地,復(fù)雜度很高,迫不得已不使用
示例代碼:
#include<iostream>//c++標(biāo)準(zhǔn)頭文件,可以使用cout,cin等標(biāo)準(zhǔn)編譯用法
#include<vector>//使用vector時(shí)需要的頭文件
#include<algorithm>//包含許多內(nèi)置函數(shù),如排序、倒置、交換等函數(shù)
using namespace std;//命名空間,防止重名給程序帶來(lái)各種隱患,使用cin,cout,map,set,vector,queue時(shí)都要使用
//遍歷函數(shù)
void print(auto v){
for(auto c:v){
cout<<c<<' ';
}
cout<<endl;
}
int main(){
vector<int> v;//定義一個(gè) int型vector
v.emplace_back(3);
v.emplace_back(4);
v.emplace_back(1);
v.emplace_back(2);
cout<<"現(xiàn)在有的元素 :";
print(v);
cout<<endl;
cout<<"v.front()="<<v.front()<<endl;
cout<<"v.back()="<<v.back()<<endl;
cout<<endl;
// 排序
sort(v.begin(),v.end());
cout<<"排序后 :";
print(v);
cout<<"v.front()="<<v.front()<<endl;
cout<<"v.back()="<<v.back()<<endl;
cout<<"v.size()="<<v.size()<<endl;
cout<<endl;
// 插入5、6
v.insert(v.begin()+2,{5,6});
cout<<"插入5、6后: ";
print(v);
cout<<endl;
// 倒置
reverse(v.begin(),v.end());
cout<<"倒置后: ";
print(v);
cout<<endl;
// 逆序排序
sort(v.rbegin(),v.rend());
cout<<"逆序排序后 :";
print(v);
// 判斷是否為空
cout<<"v.empty()="<<v.empty()<<endl;
cout<<"(v.size()==0)="<<(v.size()==0)<<endl;
cout<<endl;
v.clear();
cout<<"v清空后"<<endl;
cout<<"v.empty()="<<v.empty()<<endl;
cout<<"(v.size()==0)="<<(v.size()==0)<<endl;
}
運(yùn)行結(jié)果:
現(xiàn)在有的元素 :3 4 1 2
v.front()=3
v.back()=2
排序后 :1 2 3 4
v.front()=1
v.back()=4
v.size()=4
插入5、6后: 1 2 5 6 3 4
倒置后: 4 3 6 5 2 1
逆序排序后 :6 5 4 3 2 1
v.empty()=0
(v.size()==0)=0
v清空后
v.empty()=1
(v.size()==0)=1
4、vector的三種遍歷方法
(1)迭代器iterator
代碼:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;//定義
v.emplace_back(1);//插入元素1
v.emplace_back(3);//插入元素3
v.emplace_back(2);//插入元素2
vector<int>::iterator it;//使用迭代器
for(it=v.begin();it!=v.end();it++){
cout<<*it<<' ';
}
}
運(yùn)行結(jié)果:
1 3 2
(2)下標(biāo)遍歷
代碼:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;//定義
v.emplace_back(1);//插入元素1
v.emplace_back(3);//插入元素3
v.emplace_back(2);//插入元素2
for(int i=0;i<v.size();i++){
cout<<v[i]<<' ';
}
}
運(yùn)行結(jié)果:
1 3 2
(3)foreach遍歷
代碼:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;//定義
v.emplace_back(1);//插入元素1
v.emplace_back(3);//插入元素3
v.emplace_back(2);//插入元素2
for(int c:v){
cout<<c<<' ';
}
}
運(yùn)行結(jié)果:
1 3 2
兩種逆序遍歷:
代碼:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;//定義
v.emplace_back(1);//插入元素1
v.emplace_back(3);//插入元素3
v.emplace_back(2);//插入元素2
// 迭代器法
vector<int>::reverse_iterator it;//使用迭代器
for(it=v.rbegin();it!=v.rend();it++){
cout<<*it<<' ';
}
cout<<endl;
// 下標(biāo)遍歷法
for(int i=v.size()-1;i>=0;i--){
cout<<v[i]<<' ';
}
}
運(yùn)行結(jié)果:
2 3 1
2 3 1
foreach雖然簡(jiǎn)單易用,但是不支持逆序遍歷
有小伙伴發(fā)現(xiàn)dev不能編譯部分代碼,那是因?yàn)閐ev還未支持c++11,可以看這篇文章解決
dev使用c++11教程
是不是很簡(jiǎn)單呢?
剛接觸肯定會(huì)覺(jué)得難,多些做題多些用,熟悉了就容易了,兄弟萌,加油!??!
文章尚有不足,歡迎大牛們指正文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-789942.html
感謝觀看,點(diǎn)個(gè)贊吧文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-789942.html
到了這里,關(guān)于c++ vector用法 入門必看 超詳細(xì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!