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