容器名稱 | 描 述 |
---|---|
vector | 作為一個陣列實現的一系列專案,在程式執行期間可以根據需要自動增長。專案可以高 效地從向量末尾新增或刪除。從向量的中間或開始位置插入或刪除專案的效率不高 |
deque | 一系列具有頭部和尾部的專案:專案可以有效地從頭部和尾部新增或刪除。在雙端佇列(deque)的中間插入和刪除專案的效率都很低 |
list | 允許從任意位置快速新增和刪除的一系列專案 |
容器名稱 | 描 述 |
---|---|
set | 儲存一組鍵。不允許重複的值 |
multiset | 儲存一組鍵。允許重複的值 |
map | 將一組鍵對映到資料元素。每個鍵都與唯一的資料元素相關聯,並且不允許使用重複的鍵 |
multimap | 將一組鍵對映到資料元素。相同的鍵可以關聯多個值 |
疊代器型別 | 描 述 |
---|---|
前向(Forward) | 只能在容器中向前移動(使用++運算子) |
雙向(Bidirectional) | 可以在容器中前後移動(使用++和一運算子) |
隨機存取(Random-Access) | 可以在容器中前後移動,還可以直接跳轉到指定的資料專案 |
輸入(Input) | 可以使用cin從輸入裝置或檔案讀取資訊 |
輸出(Output) | 可以使用emit將資訊寫入輸出裝置或檔案 |
vector<int>::iterator list<string>::iterator
以上範例都是內部類,可以相應為 vector<int> 和 list<string> 型別的容器提供疊代器。以下範例演示了如何為 int 型別的向量和 string 列表定義疊代器,並將它們初始化為容器的開始位置。
vector<int> vect;
list<string> myList;
vector<int>::iterator vIter = vect.begin();
list<string>::iterator listIter = myList.begin();
auto vIter = vect.begin();
auto listIter = myList.begin();
auto vlter = begin(vect);
auto listlter = begin(myList);
vector<int> vect { 10, 20, 30, 40, 50}; auto vIter = vect.begin(); while (iter != vect.end()) { //列印iter位置的元素並向前疊代 cout << *iter << " "; iter ++; }下面的程式演示了如何使用上述概念知識來處理陣列和向量。它的主要思路是編寫如下模板函數:
template<typename T> void print(T begin_iter, T end_iter)
該函數釆用 T 型別形參。作為 T 傳遞的真實型別需要支援解除參照運算子 * 和字尾遞增運算子 ++。像這樣的型別進入某些 STL 容器中可以作為迭代器,或者進入陣列中作為指標。無論哪一種方式,都可以參照 T 作為迭代器型別。// This program demonstrates how iterators and related concepts can be used to write code that works with arrays and STL containers. #include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; template<typename T> void print(T begin_iter, T end_iter) { auto iter = begin_iter; while (iter != end_iter) { cout << *iter << "; iter++; } cout << endl; } int main() { // Print an array of strings string names[]{ "Anna", "Bob", "Chuck" }; print(begin(names), end(names)); // Print a vector of integers vector<int> vec{ 10, 20, 30 }; print(begin(vec), end(vec)); return 0; }程式輸出結果:
Anna Bob Chuck
10 20 30
成員函數 | 描 述 |
---|---|
at(position) |
返回向量中position位置的元素的值。範例: x = vect.at(5); 該語句可以將向量中位置5的元素的值賦給變數x |
back() |
返回對向量中最後一個元素的參照。範例: cout << vect.back() << endl; |
begin() |
返回指向向量第一個元素的疊代器。範例: iter = vect.begin(); |
capacity () |
返回在不分配額外記憶體的情況下,向量中可以儲存的元素的最大數量。它和 size 成員函數返回的值並不相同。範例: x = vect.capacity(); 該語句可以將向量的容量值賦給變數 x |
clear() |
清除向量中的所有元素。範例: vect.clear(); 該語句可以將 vect 向量中的元素全部刪除掉 |
empty() |
如果向量為空則返回 true,否則返回 false。範例: if (vect.empty()) cout<< "The vector is empty."; |
end() |
返回指向向量最後一個元素後面位置的疊代器。範例: iter = vect.end(); |
erase(iter) |
導致疊代器 iter 指向的向量元素被刪除。範例: vect.erase(iter); |
erase(iterl, iter2) |
導致疊代器 iter1 和 iter2 指定的範圍中的所有向量元素都被刪除。範例: vect.erase(iter1, iter2); |
front() |
返回對向量中第一個元素的參照。範例: cout << vector.front() << endl; |
insert(iter,value) |
將一個元素插入到向量中。範例: vect.insert(iter, x); 該語句可以將值 x 插入到由疊代器 iter 指向的元素的前面 |
insert(iter, n,value) |
將 value 的 n 個副本插入到向量中。插入的位置就在由疊代器 iter 指向的位置前面。 範例: vect.insert(iter, 7, x); 該語句可以將值 x 的 7 個副本插入到由疊代器 iter 指向的元素前面 |
pop_back() |
從向量中刪除最後一個元素。範例: vect.pop back(); 該語句可以將 vect 向量的最後一個元素刪除掉,這也意味著其大小會被減去 1 |
push_back(value) |
將 value 儲存為向量最後一個元素的新值。如果該向量的容量已經被填滿,那麼它會自動調整大小。範例: vect.push back(7); 該語句可以將 vect 向量最後一個元素的值儲存為 7 |
reverse() |
反轉向量中元素的順序。最後一個元素變成第一個元素,而第一個元素則變成最後 一個元素。範例: vect.reverse();. |
resize(n) resize(n,value) |
調整向量的大小,使它擁有 n 個元素,其中 n 大於向量的當前大小。如果包含了可選的 value 引數,則每個新元素都將使用該值進行初始化。範例,假設 vect 向量當 前包含 4 個元素: vect.resize(6,99); 該語句可以給向量新增 2 個元素,並且每個新元素都將被初始化為 99 |
size() |
返回 vector 向量中元素的個數。範例: cout << vector.size() << endl; |
swap(vector2) |
將當前向量的內容和 vectors 向量的內容交換。範例: vectl.swap(vect2); 該語句可以交換向量 vect1 和 vect2 的內容 |
算 法 | 描 述 |
---|---|
binary_search |
對某個物件執行二分搜尋,如果找到物件則返回 true,否則返回 false。範例: binary search(iter1, iter2, value); 在該語句中,iter1 和 iter2 定義了容器中的元素範圍(iter1 指向範圍中的第一個 元素,iter2 指向範圍中最後一個元素之後)。語句對元素範圍執行二分搜尋,搜尋 value。binary_search 函數在找到元素的情況下返回 true,如果未找到元素則返回 false |
count |
返回一個值出現在一個範圍內的次數。範例: number = count(iter1, iter2, value); 在該語句中,iter1 和 iter2 定義了容器中的元素範圍(iter1 指向範圍中的第一個 元素,iter2 指向範圍中最後一個元素之後)。該語句返回 value 出現在元素範圍內的次數 |
for_each |
為容器中的每個元素執行一個函數。範例: for each(iter1, iter2, func); 在這個語句中,iter1 和 iter2 定義了容器中的元素範圍(iter1 指向範圍中的第一 個元素,iter2 指向範圍中的最後一個元素之後)。第 3 個引數 func 是函數的名稱。 該語句為範圍中的每個元素呼叫函數 func,將該元素作為引數傳遞 |
find |
在容器中查詢匹配值的第一個物件並返回一個疊代器。範例: iter3 = find(iter1, iter2, value); 在該語句中,iter1 和 iter2 定義了容器中的元素範圍(iter1 指向範圍中的第一個 元素,iter2 指向範圍中最後一個元素之後)。語句在元素範圍內搜尋 value。如果找到了該值,則函數將返回一個疊代器到包含它的元素,否則返回疊代器 iter2 |
max_element |
返回範圍中最大物件的疊代器。範例: iter3 = max element(iter1, iter2); 在該語句中,iter1 和 iter2 定義了容器中的元素範圍(iter1 指向範圍中的第一個 元素,iter2 指向範圍中最後一個元素之後)。該語句返回範圍中包含最大值的元素的疊代器 |
min_element |
返回範圍中最小物件的疊代器。範例: iter3 = min element(iter1, iter2); 在該語句中,iter1 和 iter2 定義了容器中的元素範圍(iter1 指向範圍中的第一個 元素,iter2 指向範圍中最後一個元素之後)。該語句返回範圍中包含最小值的元素的疊代器 |
random_shuffle |
隨機重排容器中的元素。範例: random shuffle(iter1, iter2); 在這個語句中,iter1 和 iter2 定義了容器中的元素範圍(iter1 指向範圍中的第一 個元素,iter2 指向範圍中最後一個元素之後)。該語句可隨機地重新排列範圍中的元素 |
sort |
對某個範圍中的元素進行排序。範例: sort (iter1, iter2); 在這個語句中,iter1 和 iter2 定義了容器中的元素範圍(iter1 指向範圍中的第一 個元素,iter2 指向範圍中最後一個元素之後)。該語句將按升序對範圍中的元素進行排序。 |