C++入門之vector使用詳解
前言
兜兜轉(zhuǎn)轉(zhuǎn),我們來到了C++的vector章節(jié),今天就講講怎么使用vector吧.
vector的本質(zhì)就是一個線性的順序表,只不過在C++中被弄成了模板,以達(dá)到泛型編程目的.而使用的方面大概包括創(chuàng)建對象,數(shù)據(jù)插入,數(shù)據(jù)刪除,數(shù)據(jù)訪問,迭代器以及容量修改等方面
創(chuàng)建對象
在C++中,官方文檔所給的創(chuàng)建對象方法有4-6種,博主這里便介紹其中最常用的4種,同時博主為了大家先能夠簡單使用,會省去一些與源文檔不一樣的地方.
直接創(chuàng)建,即和類定義對象一樣,官方聲明為:explicit vector ();,
其中explict
是指不支持隱式類型轉(zhuǎn)換.
示例:
vector<int> v1; //創(chuàng)建int類型順序表 v1; vector<char> v2; //創(chuàng)建char類型順序表 v2; vector<double> v3; //創(chuàng)建double類型順序表 v3;
通過傳n個val值定義對象,達(dá)到一創(chuàng)建對象就具有n個val,官方聲明為:explicit vector (size_type n, const value_type& val = value_type();,
其中value_type就是我們需要的類型…
示例:
vector<int> v1(10,9); //創(chuàng)建int類型順序表v1,里面有10個9; vector<int> v2(v1.begin(),v1.begin()+6); //創(chuàng)建int類型順序表v2,里面有6個9;
通過迭代器區(qū)間形式創(chuàng)建對象,官方聲明為:template <class InputIterator> vector (InputIterator first, InputIterator last).
示例:
vector<int> v1(10,9); //創(chuàng)建int類型順序表v1,里面有10個9; vector<int> v2(v1.begin(),v1.begin()+6); //創(chuàng)建int類型順序表v2,里面有6個9;
通過現(xiàn)成的同類型對象創(chuàng)建對象,官方聲明為:vector (const vector& x);.
示例:
vector<char> v1(10,9); //通過前面的方法創(chuàng)建一個對象; vector<char> v2(v1); //創(chuàng)建對象v2,其內(nèi)容與v1一模一樣.
迭代器
在經(jīng)過前幾節(jié)的string洗禮,相信大家對迭代器也算比較了解,這里就直接開門見山的介紹用法吧:
- 普通迭代器接口:分別是
begin()
和end();
其中begin()
為首元素位置,end()
為末元素位置下一個位置 - 反轉(zhuǎn)迭代器接口:分別是rbegin()和
rend();
其中rbegin()
是末元素位置,rend()
是首元素前一個位置.
示例:
vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); //這四個步驟大概意思為插入 1 2 3 4 vector<int>::iterator it = v1.begin(); while(it != v1.end()) { cout<<*it<<" "; } cout<<endl; //到這一步會輸出 1 2 3 4 it = v1.rbegin(); while(it != rend()) { cout<<*it<<" "; } cout<<endl; //到這一步會輸出4 3 2 1
數(shù)據(jù)插入
在數(shù)據(jù)插入方面,C++最常用的兩個函數(shù)接口分別是insert和push_back.前者是在目標(biāo)位置前插入,后者是進(jìn)行尾插;
尾插 ,即對象直接調(diào)用push_back(),然后傳值進(jìn)去.
vector<int> v1; //先創(chuàng)建一個對象. v1.push_back(1); //尾插數(shù)據(jù)1 v1.push_back(2); //尾插數(shù)據(jù)2 v1.push_back(3); //尾插數(shù)據(jù)3 // 現(xiàn)在v1的數(shù)據(jù)內(nèi)容情況為 1 2 3
而任意位置插入最常用的有3種,分別是
- 在pos位置直接插入一個元素,pos是一個迭代器
- 在pos位置直接插入n個元素,pos是一個迭代器
- 在pos位置插入一段區(qū)間(區(qū)間用迭代器表示),pos是一個迭代器
示例:
數(shù)據(jù)刪除
在刪除數(shù)據(jù)方面,主要有兩個接口,分別是erase()和pop_back(),前者是給一個迭代器,然后刪除.后者是尾刪,不需要參數(shù)
尾刪:
vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v1.pop_back(); //尾刪元素4 v1.pop_back(); //尾刪元素3 v1.pop_back(); //尾刪元素2 //目前該容器還剩下元素 1
傳迭代器形式刪除
vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v1.erase(v1.begin()); //刪除第一個元素1 v1.erase(v1.begin()+1); //刪除現(xiàn)在容容器的第二個元素3 //目前還剩下元素2 4
容量操作
在這方面,c++提供了size(),resize(),capacity(),empty()
幾個常用操作.
- 獲取目前元素數(shù)量
vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v1.size(); //獲取到元素數(shù)量為4個
重新調(diào)整大小,其中如果傳入的n小于原來的size,那么容器就會縮減到n,同時傳入的另外參數(shù)無效;如果n大于size,就會擴(kuò)大到n,參數(shù)有效,和string的使用一樣. 官方文檔為:void resize (size_type n, value_type val = value_type());
示例:
vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v1.resize(3,0); //只會縮減到3個size,傳入的另一個0無效 v1.resize(6,9); //現(xiàn)在6大于size:3,所以9有效 //現(xiàn)在內(nèi)容為1 2 3 9 9 9
獲取容量
vector<int> v1; v1.capacity(); //注意哦~,這個容量和size并不一樣.
判斷是否為空
示例:
vector<int> v1; if(v1.empty()) { cout<<"容易為空"<<endl; } else { cout<<"容器不為空"<<endl; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++結(jié)構(gòu)體中變長數(shù)組的使用問題分解刨析
變長數(shù)組在C++中指的是集合(也叫容器)如vector就是C語言中,所有的數(shù)組都不定長,沒有下標(biāo)越界的概念,數(shù)組實質(zhì)就是一個指針(由數(shù)組名充當(dāng))因此C語言中數(shù)組的長度沒有任何意義平常在C語言中講的不定長數(shù)組,其實就是指針2022-08-08Matlab實現(xiàn)極坐標(biāo)堆疊柱狀圖的繪制
極坐標(biāo)堆疊圖也是風(fēng)玫瑰圖的常用形式,MATLAB的bar繪制的條形圖可以繪制成堆疊形式,但是并沒有一個自帶函數(shù)可以繪制極坐標(biāo)堆疊圖。本文將為大家提供Matlab繪制極坐標(biāo)堆疊柱狀圖的示例代碼,需要的可以參考一下2022-08-08LintCode-排序列表轉(zhuǎn)換為二分查找樹分析及實例
這篇文章主要介紹了LintCode-排序列表轉(zhuǎn)換為二分查找樹分析及實例的相關(guān)資料,需要的朋友可以參考下2017-04-04C數(shù)據(jù)結(jié)構(gòu)循環(huán)鏈表實現(xiàn)約瑟夫環(huán)
這篇文章主要介紹了C數(shù)據(jù)結(jié)構(gòu)循環(huán)鏈表實現(xiàn)約瑟夫環(huán)的相關(guān)資料,需要的朋友可以參考下2017-05-05