1. 程式人生 > 其它 >STL標準模版庫--vector的操作集合

STL標準模版庫--vector的操作集合

技術標籤:STL 詳解

  1. vector常規用法

  2. vector迭代器失效

通常會出現迭代器失效的情況:

(1)insert時(可能會增容),增容後會出現野指標,從而引發迭代器失效;

(2)erase時(vs報錯,但linux並不一定報錯),如果刪的是最後一個位置,就會會出現越界的情況,也就是空間不夠,從而引發迭代器失效;

1. vector常規用法

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
//vector是將元素置於一個動態陣列中加以管理的容器,支援下標索引[],at()方法
//元素是按照值拷貝的方式進行的,所以要提供拷貝建構函式 void printVector(vector<int>vectorPrint){ for (int c : vectorPrint){ cout << c << " "; } cout << endl; } int main() { //1.帶引數的建構函式 cout << "1.帶引數的建構函式" << endl; int a[] = { 0, 1, 2, 3, 4 }; int b[] = { 5, 6, 7
, 8, 9 ,10 }; vector<int>vectorA(a, a + 5);//可以將相對應的記憶體地址連續的賦值給容器,區間是左閉右開的原則 vector<int>vectorB(vectorA.begin(), vectorA.end());//本質上還是兩個地址區間的內容進行賦值 vector<int>vectorC(3, 9);//建構函式將3個9進行拷貝賦值 vector<int>vectorD(vectorA);//兩個型別相同的容器進行拷貝賦值 printVector(vectorA); printVector(vectorB)
; printVector(vectorC); printVector(vectorD); //2.賦值操作 cout << "2.賦值操作" << endl; vectorA.assign(a, a + 5);//重新分配,不使用拷貝建構函式 printVector(vectorA); vectorB.assign(vectorA.begin(), vectorA.end()); printVector(vectorB); vectorD = vectorB; printVector(vectorD); vectorB.assign(b, b + 5);//重新分配賦值 printVector(vectorB); vectorD.swap(vectorB);// 同類型容器值交換,只覆蓋vectorD.size()個位置 printVector(vectorD); //3.容器大小操作 cout << "3.容器大小操作" << endl; cout<< vectorD.size()<< endl;//求容器的大小 bool dempty = vectorD.empty();//判斷容器是否為空,是空的話為1 cout << "dempty = " << dempty << endl; vectorD.resize(6);//重新設定容器大小,預設使用0填充 printVector(vectorD); vectorD.resize(8, 3); //重新設定容器大小,顯示呼叫3填充 printVector(vectorD); vectorD.resize(2); //重寫設定大小,截斷後面多餘部分 printVector(vectorD); //4.容器末尾新增和刪除元素 cout << "4.容器末尾新增和刪除元素" << endl; vector<int>vectorE; vectorE.push_back(1);//從末尾插入元素 vectorE.push_back(3); vectorE.push_back(5); vectorE.push_back(7); vectorE.push_back(9); printVector(vectorE); vectorE.pop_back();//從末尾彈出元素 vectorE.pop_back(); printVector(vectorE); //5.vector資料元素的存取 cout << "5.vector資料元素的存取" << endl; cout << vectorE[0]<< endl;//根據下標求容器對應位置的值 cout << vectorE.at(1) << endl; cout << vectorE.front() << endl; //返回開始位置元素 cout << vectorE.back() << endl; //返回末尾元素 for (vector<int>::iterator it = vectorE.begin(); it != vectorE.end(); ++it) //it++前面++返回引用,後者++返回值 cout << *it << " "; //正向遍歷,而且是可以修改的 cout << endl; for (vector<int>::reverse_iterator it = vectorE.rbegin(); it != vectorE.rend(); ++it) cout << *it << " "; //反向遍歷 ,而且是可以修改的 cout << endl; for (vector<int>::const_iterator it = vectorE.begin(); it != vectorE.end(); ++it)//it++前面++返回引用,後者++返回值 cout << *it << " "; //正向遍歷,不可以修改的,是常指標 cout << endl; for (vector<int>::const_reverse_iterator it = vectorE.rbegin(); it != vectorE.rend(); ++it) cout << *it << " "; //反向遍歷 ,不可以修改的,是常指標*/ cout << endl; //6.插入操作 cout << "6.插入操作" << endl; vector<int>vectorF(1); //填入設定的大小,預設為0 vector<int>vectorG(2); //填入設定的大小,預設為0 cout << "vectorF" << endl; printVector(vectorF); cout << "vectorG" << endl; printVector(vectorG); vectorF.insert(vectorF.begin(), 11); //從vectorF.begin()開始插入此元素 cout << "vectorF insert1" << endl; printVector(vectorF); vectorF.insert(vectorF.begin() + 1, 2, 22); //從vectorF.begin()開始插入n個此元素 cout << "vectorF insert2" << endl; printVector(vectorF); vectorF.insert(vectorF.begin(), vectorG.begin(), vectorG.end());//從vectorF.begin()開始將整個區間的元素插入此位置 //7.刪除和清除操作 cout << "7.刪除和清除操作" << endl; printVector(vectorF); vectorF.clear();//刪除此容器內的所有元素 printVector(vectorF); vector<int>::const_iterator it = vectorF.begin(); //常指標,刪除會報錯 vectorF.erase(it); //刪除位置上的元素,但是引數是迭代器 // 刪除的時候該函式返回的是刪除位置的下一個位置的迭代器 vectorF.erase(it, it + 3); //刪除迭代器所指向的區間的元素 return 0; }

2.迭代器失效

(1)insert時(可能會增容),增容後會出現野指標,從而引發迭代器失效;

(2)erase時(vs報錯,但linux並不一定報錯),如果刪的是最後一個位置,就會會出現越界的情況,也就是空間不夠,從而引發迭代器失效;

通俗講

vector<int>::iterator it = vectorE.begin(); it != vectorE.end(); ++it) 
   通過it迭代器增加或者刪除

在獲取到vector物件的首元素地址後,後面在進行插入和刪除進行操作時,有可能會發生vector的自動擴容或者縮容,因此導致it迭代器指向的地址不一樣,導致迭代器失效