STL標準模版庫--vector的操作集合
阿新 • • 發佈:2021-02-12
技術標籤:STL 詳解
-
vector常規用法
-
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迭代器指向的地址不一樣,導致迭代器失效