一、STL的基本概念
STL(Standard Template Library)標準模板庫大體上分為六大元件,分別為容器,演算法,迭代器,仿函式,介面卡和空間配置器,其中最重要的是容器,演算法和迭代器,容器和演算法之間通過迭代器無縫連線。
容器:各種資料結構,比如vector,list,deque,set,map等,用來存放資料;
演算法:各種常用的演算法,比如sort,find,copy,for_each等;
迭代器:提供一種方法,能夠依序尋訪某個容器所含的各個元素,每個容器都有自己專屬的迭代器。迭代器的使用非常類似於指標,可以將迭代器作為指標來理解。
二、vector容器的宣告和初始化
vector<T> v; // T代表模板,可以是任意的資料型別比如int,char,string等
vector<T> Name(v.begin(), v.end()); // 將[v.begin(), v.end)之間的元素賦值建立的Name容器
vector<T> Name(n, elem); // 將Name初始化為包含10個elem值的容器
vector<T> Name(v); // 拷貝建構函式,將容器v賦值給容器Name
三、vector容器的增刪改查
/***********************增加元素****************************/
push_back(elem); // vector尾部插入元素elem
insert(const_iterator, elem); // 在迭代器指向的位置插入元素elem
/***********************刪除元素****************************/
pop_vack(); // 刪除vector最後一個元素
erase(const_iterator); // 刪除迭代器指向位置的元素
erase(const_iterator start, const_iterator_end); // 刪除迭代器start和end之間所有的元素
clear(); // 刪除vector之間的所有元素
/***********************訪問元素****************************/
for(vector<int>::iterator it=v.begin(); it!=v.end(); it++) //it是vector<int>的迭代器,可以理解為指向容器內元素的指標
for(auto it=v.begin(); it!=v.end(); it++) // 通過auto自動推理出it的型別
for(auto sub_v : v) // 增強型for迴圈,直接通過底層的迭代器訪問容器內元素
for(int i=0; i<v.size(); i++) // 普通for迴圈,i表示元素的下標,可以與陣列一樣通過"v[i]"來訪問,或者"v.at(int i)"
四、vector容器的特點
vector資料結構類似於陣列,但是與普通陣列不同的是:vector容器可以動態擴充套件,但是vector並不是在原空間之後續接新的空間,而是尋找更大的記憶體空間然後將後設資料拷貝到新的空間,之後再釋放原空間。
但是每次vector擴充套件空間之後都會多預留一部分空間,當新增的元素個數不超過預留的空間時,便可以直接續接在原vector後面。
vector中使用size()函式來計算容器內元素的個數,而capacity()函式則返回容器的容量。元素個數相當於vector內實際儲存的資料個數,而容器的容量則代表容器開闢的記憶體空間個數,因此容量>=元素個數。
下面我們來通過一段程式碼來理解一下上述的內容:
vector<int>test;
int* p = nullptr;
int count=0;
for(int i=0; i<10; i++){
test.push_back(i); // 通過push_back的方式存入資料,理論上每push_back一次,vector便複製一次
if(p != &test[0]){ // 如果容器進行了複製,那麼首地址必然會變,記錄下首地址的變化次數,便得到複製次數
p = &test[0];
count++;
}
}
cout << "vector 複製的次數:" << count << endl; // 輸出複製次數
cout << "vector 的容量:" << test.capacity() << endl; // 輸出vector的容量
cout << "vector 的元素個數:" << test.size() << endl; // 輸出vector的元素個數
/************************輸出結果***********************/
vector 複製的次數:7 // 可以看出vector只複製了7次,可以判斷每次vector在複製時預留了空間
vector 的容量:13 // 此時,vector中有13個位置,比元素個數多3個,即為預留的空間
vector 的元素個數:10 // 正兒八經的元素個數