stl-vector
標(biāo)準(zhǔn)庫(kù)Vector類型
使用需要的頭文件:
#include <vector>
Vector:Vector 是一個(gè)類模板。不是一種數(shù)據(jù)類型。 Vector<int>是一種數(shù)據(jù)類型。
?
一、??定義和初始化
Vector<T> v1;???????//默認(rèn)構(gòu)造函數(shù)v1為空
Vector<T> v2(v1);//v2是v1的一個(gè)副本
Vector<T> v3(n,i);//v3包含n個(gè)值為i的元素
Vector<T> v4(n);??//v4含有n個(gè)值為0的元素
二、??值初始化
1>?????如果沒(méi)有指定元素初始化式,標(biāo)準(zhǔn)庫(kù)自行提供一個(gè)初始化值進(jìn)行值初始化。
2>?????如果保存的式含有構(gòu)造函數(shù)的類類型的元素,標(biāo)準(zhǔn)庫(kù)使用該類型的構(gòu)造函數(shù)初始化。
3>?????如果保存的式?jīng)]有構(gòu)造函數(shù)的類類型的元素,標(biāo)準(zhǔn)庫(kù)產(chǎn)生一個(gè)帶初始值的對(duì)象,使用這個(gè)對(duì)象進(jìn)行值初始化。
三、Vector對(duì)象最重要的幾種操作
1.????v.push_back(t)?????????????在數(shù)組的最后添加一個(gè)值為t的數(shù)據(jù)
2.????v.size()?????????????????????????當(dāng)前使用數(shù)據(jù)的大小
3.????v.empty()??????????????????????判斷vector是否為空
4.????v[n]???????????????????????????????返回v中位置為n的元素
5.????v1=v2???????????????????????????把v1的元素替換為v2元素的副本
6.????v1==v2?????????????????????????判斷v1與v2是否相等
7.????!=、<、<=、>、>=??????保持這些操作符慣有含義
vector容器類型
???vector容器是一個(gè)模板類,可以存放任何類型的對(duì)象(但必須是同一類對(duì)象)。vector對(duì)象可以在運(yùn)行時(shí)高效地添加元素,并且vector中元素是連續(xù)存儲(chǔ)的。
vector的構(gòu)造
函數(shù)原型:
template<typename T>
???explicit vector();?????????????????????????????????// 默認(rèn)構(gòu)造函數(shù),vector對(duì)象為空
???explicit vector(size_type n, const T& v = T());????// 創(chuàng)建有n個(gè)元素的vector對(duì)象
???vector(const vector& x);
???vector(const_iterator first, const_iterator last);
注:vector容器內(nèi)存放的所有對(duì)象都是經(jīng)過(guò)初始化的。如果沒(méi)有指定存儲(chǔ)對(duì)象的初始值,那么對(duì)于內(nèi)置類型將用0初始化,對(duì)于類類型將調(diào)用其默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化(如果有其它構(gòu)造函數(shù)而沒(méi)有默認(rèn)構(gòu)造函數(shù),那么此時(shí)必須提供元素初始值才能放入容器中)。
舉例:
vector<string> v1;?????????// 創(chuàng)建空容器,其對(duì)象類型為string類
vector<string> v2(10);?????// 創(chuàng)建有10個(gè)具有初始值(即空串)的string類對(duì)象的容器
vector<string> v3(5, "hello"); // 創(chuàng)建有5個(gè)值為“hello”的string類對(duì)象的容器
vector<string> v4(v3.begin(), v3.end()); // v4是與v3相同的容器(完全復(fù)制)
c.push_back(elem); //在容器最后位置添加一個(gè)元素elemc.pop_back(); //刪除容器最后位置處的元素c.at(index); //返回指定index位置處的元素c.begin(); // 返回指向容器最開(kāi)始位置數(shù)據(jù)的指針c.end(); // 返回指向容器最后一個(gè)數(shù)據(jù)單元的指+1c.front(); // 返回容器最開(kāi)始單元數(shù)據(jù)的引用c.back(); // 返回容器最后一個(gè)數(shù)據(jù)的引用c.max_size(); // 返回容器的最大容量c.size(); // 返回當(dāng)前容器中實(shí)際存放元素的個(gè)數(shù)c.capacity();// 同c.size()c.resize(); // 重新設(shè)置vector的容量c.reserve();// 同c.resize()c.erase(p);// 刪除指針p指向位置的數(shù)據(jù),返回下指向下一個(gè)數(shù)據(jù)位置的指針(迭代器c.erase(begin,end) // 刪除begin,end區(qū)間的數(shù)據(jù),返回指向下一個(gè)數(shù)據(jù)位置的指針(迭代器)c.clear(); // 清除所有數(shù)據(jù)c.rbegin(); // 將vector反轉(zhuǎn)后的開(kāi)始指針?lè)祷?其實(shí)就是原來(lái)的end-1)c.rend(); // 將vector反轉(zhuǎn)后的結(jié)束指針?lè)祷?其實(shí)就是原來(lái)的begin-1)c.empty(); // 判斷容器是否為空,若為空返回true,否則返回falsec1.swap(c2); // 交換兩個(gè)容器中的數(shù)據(jù)c.insert(p,elem);// 在指針p指向的位置插入數(shù)據(jù)elem,返回指向elem位置的指針 c.insert(p,n,elem);//在位置p插入n個(gè)elem數(shù)據(jù),無(wú)返回值c.insert(p,begin,end)// 在位置p插入在區(qū)間[begin,end)的數(shù)據(jù),無(wú)返回值
應(yīng)用實(shí)例:
#include <iostream> #include <cassert> #include <vector> using namespace std; int main() {vector<string> v(5, "hello");vector<string> v2(v.begin(), v.end());assert(v == v2);cout<<"> Before operation"<<endl;for(vector<string>::const_iterator it = v.begin(); it < v.end(); ++it)cout<<*it<<endl;v.insert(v.begin() + 3, 4, "hello, world");cout<<"> After insert"<<endl;for(vector<string>::size_type i = 0; i < v.size(); ++i)cout<<v[i]<<endl;vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6);assert(*it == "hello, world");cout<<"> After erase"<<endl;for(vector<string>::size_type i = 0; i != v.size(); ++i)cout<<v[i]<<endl;assert(v.begin() + v.size() == v.end());assert(v.end() - v.size() == v.begin());assert(v.begin() - v.end() == -vector<string>::difference_type(v.size()));return 0; }
程序說(shuō)明:上面程序中用了三個(gè)循環(huán)輸出容器中的元素,每個(gè)循環(huán)的遍歷方式是不一樣的。特別需要說(shuō)明的是,第二個(gè)循環(huán)在條件判斷中使用了size() 函數(shù),而不是在循環(huán)之前先保存在變量中再使用。之所以這樣做,有兩個(gè)原因:其一,如果將來(lái)在修改程序時(shí),在循環(huán)中修改了容器元素個(gè)數(shù),這個(gè)循環(huán)仍然能很好地工作,而如果先保存size()函數(shù)值就不正確了;其二,由于這些小函數(shù)(其實(shí)現(xiàn)只需要一條返回語(yǔ)句)基本上都被聲明為inline,所以不需要考慮效率問(wèn)題。
---------------------------------
c++編程語(yǔ)言中有一種叫做Vector的應(yīng)用方法,它的作用在實(shí)際編程中是非常重要的。在這里我們將會(huì)為大家詳細(xì)介紹一下C++ Vector的相關(guān)應(yīng)用技巧及基本內(nèi)容,希望能給大家?guī)?lái)一些幫助。
(1)vector< 類型 > 標(biāo)識(shí)符 ;
(2)vector< 類型 > 標(biāo)識(shí)符(最大容量) ;
(3)vector< 類型 > 標(biāo)識(shí)符(最大容量,初始所有值);
(4) int i[4] = {12,3,4,5};
1.???????????????vector<?類型?>?vi(i?,?i+2);?//得到i索引值為3以后的值?;??
(5)vector< vector<int> > //vi 定義2維的容器;記得一定要有空格,不然會(huì)報(bào)錯(cuò)
1.???????????????vector<?int?>?line???
2.???????????????//?在使用的時(shí)候一定要首先將vi個(gè)行進(jìn)行初始化;???
3.???????????????for(int?i?=?0?;?i?<?10?;?i?++) ?
4.???????????????{ ?
5.???????????????vector.push_back(line); ?
6.???????????????} ?
7.???????????????///?個(gè)人認(rèn)為使用vector定義二維數(shù)組很好,
因?yàn)槭情L(zhǎng)度可以不預(yù)先確定。很好。?
(6)C++ Vector排序
1.???????????????vector<?int?>?vi?;???
2.???????????????vi.push_back(1); ?
3.???????????????vi.push_back(3); ?
4.???????????????vi.push_back(0); ?
5.???????????????sort(vi.begin()?,?vi.end());?///?/小到大 ?
6.???????????????reverse(vi.begin(),vi.end())?///?從大道小?
(7)順序訪問(wèn)
1.???????????????vector?<?int?>?vi?;???
2.???????????????for(?int?i?=?0?;?i?<?10?;?i?++) ?
3.???????????????{ ?
4.???????????????vector.push_back(i); ?
5.???????????????}???
6.???????????????for(int?i?=?0?;?i?<?10?;?i?++)?///?第一種調(diào)用方法 ?
7.???????????????{ ?
8.???????????????cout?<<vector[i]?<<"?"?;???
9.???????????????} ?
10.???????????for(vector<int>::iterator?it?=?vi.begin()?;?
11.???????????it?!=vi.end()?;?it++)?///第二種調(diào)用方法 ?
12.???????????{ ?
13.???????????cout?<<?*it?<<?"?"?; ?
14.???????????}?
(8)尋找
1.???????????????vector?<?int?>?vi?;???
2.???????????????for(?int?i?=?0?;?i?<?10?;?i?++) ?
3.???????????????{ ?
4.???????????????vector.push_back(i); ?
5.???????????????}???
6.???????????????vector?<?int?>::interator?it?=?find(vi.begin()?,?vi.end,3)?; ?
7.???????????????cout?<<?*it?<<?endl?;?///返回容器內(nèi)找到值的位置。?
(9)使用數(shù)組對(duì)C++ Vector進(jìn)行初始化
1.???????????????int?i[10]?={1,2,3,4,5,6,7,78,8}?; ?
2.???????????????///第一種???
3.???????????????vector<int>?vi(i+1,i+3);?///從第2個(gè)元素到第三個(gè)元素 ?
4.???????????????for(vector?<int>::interator?it?=?vi.begin()?;?
5.???????????????it?!=?vi.end()?;?it++) ?
6.???????????????{ ?
7.???????????????cout?<<?*it?<<"?"?;???
8.???????????????}?
(10) 結(jié)構(gòu)體類型
1.???????????????struct?temp ?
2.???????????????{ ?
3.???????????????public?: ?
4.???????????????string?str?;???
5.???????????????public?: ?
6.???????????????int?id?; ?
7.???????????????}tmp ?
8.???????????????int?main() ?
9.???????????????{ ?
10.???????????vector?<temp>?t?;???
11.???????????temp?w1?;???
12.???????????w1.str?=?"Hellowor"?; ?
13.???????????w1.id?=?1?;???
14.???????????t.push_back(w1); ?
15.???????????cout?<<?w1.str?<<?","?<<w1.id?<<endl?;???
16.???????????return?0?;???
17.???????????}?
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的stl-vector的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: stl-优先队列priority_que
- 下一篇: 解决scanf_s函数报错:没有为格式字