C++语言基础 —— STL —— 容器与迭代器
【概述】
STL 是指 C++ 標準模板庫,是 C++ 語言標準中的重要組成部分,其以模板類和模版函數的形式提供了各種數據結構與算法的精巧實現,如果能充分使用 STL,可以在代碼空間、執行時間、編碼效率上得到極大的提高。
STL 大致可以分為三大類:容器(Container)、迭代器(iterator)、算法(algorithm)。
STL 容器是一些模板類,提供了多種組織數據的常用方法,例如:vector(向量)、list(列表)、deque(雙向隊列)、set(集合)、map(映象)、stack(棧)、queue(隊列)、priority_queue(優先隊列) 等,通過模版的參數可以指定容器中元素類型。
STL 算法是一些模板函數,提供了相當多的有用算法和操作,從簡單如 for_each(遍歷) 到復雜如?stable_sort(穩定排序)。
STL 迭代器是對 C 中的指針的一般化,用來將算法和容器聯系起來,幾乎所有的 STL 算法都是通過迭代器來存取元素序列進行工作的,而STL 中的每一個容器也都定義了其本身所專有的迭代器,用以存取容器中的元素。
【容器】
容器主要分為三類:序列式容器(vector、list、deque)、適配器容器(stack、queue、priority_queue)、關聯式容器(set、multiset、map、multimap)
其特點如下:
- 向量(vector):連續存儲的元素,位于 <vector>
- 列表(list):由節點組成的雙向鏈表,每個結點包含著一個元素,位于 <list>
- 雙端隊列(deque):連續存儲的指向不同元素的指針所組成的數組,位于 <deque>
- 棧(stack):后進先出的值的排列,位于 <stack>
- 隊列(queue):先進先出的值的排列,位于 <queue>
- 優先隊列(priority_queue):元素的次序是由作用于所存儲的值對上的某種謂詞決定的的一種隊列,位于 <queue>
- 集合(set):由節點組成的紅黑樹,每個節點都包含著一個元素,節點之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序,位于 <set>
- 多重集合(multiset):允許存在兩個次序相等的元素的集合,位于 <set>
- 映射(map):由鍵-值對組成的集合,以某種作用于鍵對上的謂詞排列,位于 <map>
- 多重映射(multimap):允許鍵對有相等的次序的映射,位于 <map>
容器的具體使用:
- pair(元素對):點擊這里
- vector(向量):點擊這里
- list(列表)與 deque(雙端隊列):點擊這里
- stack(棧)與 queue(隊列):點擊這里
- priority_queue(優先隊列):點擊這里
- set(集合)與 multiset(多重集合):點擊這里
- map(映射)與 multimap(多重映射):點擊這里
- heap(堆):點擊這里
除以上容器外,還有一個常用的模板類 bitset,具體使用:點擊這里
【迭代器的使用】
C++ 的 STL 為每一種容器都定義了一種迭代器類型,迭代器是一種檢查容器內元素并遍歷元素的數據類型,C++ 中,對容器的訪問操作更趨向于是用迭代器而非下標操作,只有少數容器(如 vector)支持下標操作訪問容器元素。
迭代器類型可以用 * 操作符來訪問迭代器所指向的元素,以 *iter = 0 為例,假設 it 指向 vector 對象 v 的第一個元素,那么 *iter 與 v[0] 就是指向同一個元素,那么 *iter = 0 就是將這個元素賦值為 0,同數組類似,迭代器可以使用自增、自減操作符向前、向后移動迭代器指向容器中的下一個元素。
迭代器的常用操作:
- *iter:對 iter 進行解引用,返回迭代器 iter 指向的元素的引用
- iter->men:對 iter 進行解引用,獲取指定元素中名為 men 的成員,等效于 (*iter).men
- ++iter、iter++:給 iter 加 1,使其指向容器的下一個元素
- --iter、iter--:給 iter 減 1,使其指向容器的前一個元素
- iter1==iter2:比較兩個迭代器是否相等
- iter1!=iter2:比較兩個迭代器是否不等? ? ??
幾乎每種容器都定義了一對 begin()、end() 函數,用于返回相應的迭代器,如果容器中有元素的話,由 begin() 返回的迭代器指向第一個元素,而由 end() 返回的迭代器指向容器中最后一個元素的下一個位置,其沒有指向任何實際的元素,它只是起一個標志的作用,表示已處理完容器中的所有元素。由于 end() 返回的迭代器不指向任何元素,因此不能對它進行解引用(*)或自增(++)操作。
假設已經聲明一個 vector<int> 的 ivec 容器,可以用迭代器來遍歷 ivec 容器,把其每個元素重置為0:
vector<int> v; vector<int>::iterator iter=ivec.begin(); for(;iter!=ivec.end();iter++)*iter=0;?
總結
以上是生活随笔為你收集整理的C++语言基础 —— STL —— 容器与迭代器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Purification(CF-330C
- 下一篇: C++语言基础 —— 函数