/*************************************** *Vector總結 *vector模塑出一個動態數組,所以,它自己是「將元素至於動態數組中加以管理」 *的一個抽象的概念。 * *1.使用前須要包含頭文件<vector> *2.Vector將其元素複製到內部的dynamic array中。 元素之間老是存在某種順序,因此vector是一種有序羣集(ordered collec)。 vector支持隨機存取,所以只要知道位置,你能夠在常數時間內存取任何一個元素。 vector的迭代器是隨機存取迭代器,因此對任何一個STL算法均可以奏效。 *我的理解:vector是在末端插入 或者 刪除元素,能夠說至關於一個棧吧。 *vector中用於操做大小的函數 size(); empty(); max_size(); capacity();(返回vector實際能容納的元素數量,若是超過這個數量,vector就有必要從新配置內部存儲器) A.一旦內存從新配置,和vector元素相關的全部reference、pointers、iterators都會失效 B.內存從新配置很耗時間 因此若是你的程序管理了和vector元素相關的reference、pointers、iterators, 或者若是執行速度對你而言相當重要,那麼就必須考慮容量問題。 *避免從新配置內存的方法 能夠用 reserve()保留適當的容量 std::vector<int> v; v.reserve(80); 另外一種避免從新配置內存的方法是,初始化期間就向構造函數傳遞附加參數,構造出足夠的空間, 若是是ACM的話,通常是這樣用的。 std::vector<T> v(5); vector不能使用reserve()來所見容量,這一點於string不一樣。 *構造,拷貝和解構 vector<Elem> c 產生一個空vector,其中沒有任何元素 vector<Elem> c1(c2) 產生另外一個同型vector的副本(全部元素都被拷貝) vector<Elem> c(n) 利用元素的default構造函數生成一個大小爲n的vector vector<Elem> c(n,elem) 產生一個大小爲n的vector,每一個元素值都是elem vector<Elem> c(beg,end) 產生一個vector,以區間[beg;end]做爲元素初值 c.~vector<Elem>() 銷燬全部元素,並釋放內存 *非變更性操做(Nonmodifying Operation) c.size(); c.empty() c,max_size(); capacity(); reserve(); //並不是徹底意義上的非變更 c1 == c2; c1 != c2 c1 < c2; c1 > c2; c1 <= c2; c1 >= c2; *賦值(Assignments) c1 = c2 將c2的所有元素賦值給c1 c.assign(n,elem) 複製n個elem,賦值給c c.assign(beg,end) c1.swap(c2) swap(c1,c2) *元素存取(Element Access) c.at(idx) 返回索引idx所標識的元素。若是idx越界拋出out_of_range c[idx] 返回索引idx所表示的元素,不進行範圍檢查 //我的以爲就是把vector看成一個數組來用了 c.front() 返回第一個元素,不檢查第一個元素是否存在 c.back() 返回最後一個元素,不檢查最後一個元素是否存在 //對於調用者來講,最重要的事情莫過於搞清楚這些操做是否進行範圍檢查。 //只有at()會這麼作 //對一個vector調用operation[],front(),back(),都會引起未定義行爲。 *迭代器相關函數(Iterator Function) vector提供了一些常規函數來獲取迭代器。(一般就是一個指針) c.begin(); 返回一個隨機存取迭代器,指向第一個元素 c.end(); 返回一個隨機存儲迭代器,指向最後一個元素的一下個位置 c.rbegin(); 返回一個逆向迭代器,指向逆向迭代的第一個元素 c.rend(); *安插(insert) 和 移除(remove)元素 c.insert(pos,elem) 在pos位置上插入一個elem副本,並返回元素位置 c.insert(pos,n,elem) 在pos位置上插入n個elem副本。無回傳值 c.insert(pos,beg,end) 在pos位置上插入區間[beg;end]內的全部元素的副本,無回傳值 c.push_back(elem) 在尾部添加一個elem副本 c.pop_back() 移除最後一個元素(但不回傳) c.erase(pos) 移除pos位置上的元素,返回下一個元素的位置 c.erase(beg,end) c.resize(num) 將元素數量改成num(若是size()變大了,多出來的新元素都以default構造函數來完成) c.resize(num,elem) c.clear() 移除全部元素,將容器清空 *將Vector看成通常Arrays使用 std::vector<char> v; v.resize(41); strcpy(&v[0],"hello, world!"); printf("%s\n",&v[0]); //千萬不要把迭代器看成第一元素的地址來傳遞。vector迭代器是由實做版本定義的,也許並非一個通常指針 //固然通常狀況下是。。。 printf("%s\n",&v[0]);//OK printf("%s\n",v.begin());//ERROR *異常處理(Exception Handling) ****************************************************************/ /********************************* Vector實例 *********************************/ #include <iostream> #include <vector> #include <iterator> using namespace std; void Print_Element(vector <string> Object); vector<string>::iterator Find(vector<string>::iterator Begin,vector<string>::iterator End,char* szTemp); void main() { vector <string> Object; Object.reserve(5); Object.push_back("Hello, "); Object.push_back("How"); Object.push_back("are"); Object.push_back("you"); Object.push_back("?"); // copy(Object.begin(),Object.end, // ostream_iterator<string>(cout," ")); Print_Element(Object); cout<<Object.max_size()<<endl; cout<<Object.size()<<endl; cout<<Object.capacity()<<endl; swap(Object[1],Object[3]); //Print_Element(Object); // Object.insert(find(Object.begin(),Object.end(),"?"),"always"); if (Find(Object.begin(),Object.end(),"?")!=NULL) //若是查找成功 我返回一個迭代器 不然返回NULL { Object.insert(Find(Object.begin(),Object.end(),"?"),"always"); } // Object.insert(Find(Object.begin(),Object.end(),"?")!=NULL,"always"); Print_Element(Object); Object.back() = "!"; //更改最後一個string Print_Element(Object); Object.front() = "xxx"; Print_Element(Object); cout<<Object.max_size()<<endl; cout<<Object.size()<<endl; cout<<Object.capacity()<<endl; //容量不足時,擴充一倍 } vector<string>::iterator Find(vector<string>::iterator Begin,vector<string>::iterator End,char* szTemp) { vector<string>::iterator pos; pos = Begin; for (pos;pos!=End;pos++) { if (pos->compare(szTemp)==0) { return pos; } } return NULL; } void Print_Element(vector <string> Object) { vector <string>::iterator it; it = Object.begin(); for (;it!=Object.end();it++) { // cout<<*it<<endl; cout<<it->data()<<" "; } cout<<endl; }
/*********************************************************************** 實例2 ***********************************************************************/ #include<iostream> #include<vector> using namespace std; void Print_Element(vector<int> Object); int main() { int i = 0; vector <int> Object(5,2); cout<<"Object.size(): "<<Object.size()<<endl; cout<<"Object.capacity(): "<<Object.capacity()<<endl; cout<<"Object.max_size(): "<<Object.max_size()<<endl; Object.reserve(10); cout<<"After reserve(10)"<<endl<<endl; cout<<"Object.size(): "<<Object.size()<<endl; cout<<"Object.capacity(): "<<Object.capacity()<<endl; cout<<"Push Data:"<<endl; for(i=0;i<5;i++) { Object.push_back(i); } Print_Element(Object); cout<<"Object.size(): "<<Object.size()<<endl; cout<<"Object.capacity(): "<<Object.capacity()<<endl<<endl; swap(Object[0],Object[8]); cout<<"After swap(Object[0],Object[8]) :"<<endl; Print_Element(Object); for(i=0;i<5;i++) { Object.pop_back(); } cout<<"After Pop Data :"<<endl<<endl; Print_Element(Object); int front = Object.front(); int back = Object.back(); cout<<"front:"<<front<<endl; cout<<"back:"<<back<<endl<<endl; cout<<"After Object.assign(3,10): "<<endl; Object.assign(3,10); Print_Element(Object); vector <int> One(Object); cout<<endl<<"After vector <int> One(Object): "<<endl; Print_Element(One); cout<<endl<<"cout<<Object[0]: "<<ends<<Object[0]<<endl<<endl; Object.resize(10,100); cout<<"After Object.resize(10,100): "<<endl; Print_Element(Object); vector <int>::iterator pos; pos = Object.begin(); cout<<"After Object.insert(pos,99): "<<endl; Object.insert(pos,99); Print_Element(Object); cout<<endl<<"Object.size(): "<<Object.size()<<endl; cout<<"Object.capacity(): "<<Object.capacity()<<endl; //這裏因爲插入了一個新的元素,因此vector的容量不夠用了, //進而致使了vector從新配置內存, //因此iterator失效了,不加上下面的 pos = Object.begin(),程序會奔潰的 // pos = Object.begin(); //必須有這句,至關於手動重置pos Object.erase(pos); cout<<endl<<"After Object.erase(pos): "<<endl; Print_Element(Object); return 0; } void Print_Element(vector<int> Object) { vector<int>::iterator it; it = Object.begin(); for(;it<Object.end();it++) { cout<<*it<<ends; } cout<<endl; }