C++ 容器
容器(container)用于存放數據的類模板。可變長數組、鏈表、平衡二叉樹等數據結構在 STL 中都被實現為容器。
程序員使用容器時,即將容器類模板實例化為容器類時,會指明容器中存放的元素是什么類型的。
容器中可以存放基本類型的變量,也可以存放對象。對象或基本類型的變量被插入容器中時,實際插入的是對象或變量的一個復制品。
STL 中的許多算法(即函數模板),如排序、查找等算法,在執行過程中會對容器中的元素進行比較。這些算法在比較元素是否相等時通常用運算符進行,比較大小通常用<運算符進行,因此,被放入容器的對象所屬的類最好重載和<運算符,以使得兩個對象用和<進行比較是有定義的。
容器分為兩大類。
順序容器
順序容器有以下三種:可變長動態數組 vector、雙端隊列 deque、雙向鏈表 list。
它們之所以被稱為順序容器,是因為元素在容器中的位置同元素的值無關,即容器不是排序的。將元素插入容器時,指定在什么位置(尾部、頭部或中間某處)插入,元素就會位于什么位置。
關聯容器
關聯容器有以下四種:set、multiset、map、multimap。關聯容器內的元素是排序的。插入元素時,容器會按一定的排序規則將元素放到適當的位置上,因此插入元素時不能指定位置。
默認情況下,關聯容器中的元素是從小到大排序(或按關鍵字從小到大排序)的,而且用<運算符比較元素或關鍵字大小。因為是排好序的,所以關聯容器在查找時具有非常好的性能。
除了以上兩類容器外,STL 還在兩類容器的基礎上屏蔽一部分功能,突出或增加另一部分功能,實現了三種容器適配器:棧 stack、隊列 queue、優先級隊列 priority_queue。
容器都是類模板。它們實例化后就成為容器類。用容器類定義的對象稱為容器對象。
例如,vector是一個容器類的名字,vector a;就定義了一個容器對象 a,a 代表一個長度可變的數組,數組中的每個元素都是 int 類型的變量;vector b;定義了另一個容器對象 b,a 和 b 的類型是不同的。
任何兩個容器對象,只要它們的類型相同,就可以用 <、<=、>、>=、==、!= 進行詞典式的比較運算。假設 a、b 是兩個類型相同的容器對象,這些運算符的運算規則如下。
a == b:若 a 和 b 中的元素個數相同,且對應元素均相等,則a == b的值為 true,否則值為 false。元素是否相等是用==運算符進行判斷的。a<b:規則類似于詞典中兩個單詞比較大小,從頭到尾依次比較每個元素,如果發生 a 中的元素小于 b 中的元素的情況,則a<b的值為 true;如果沒有發生 b 中的元素小于 a 中的元素的情況,且 a 中的元素個數比 b 少,a<b的值也為 true;其他情況下值為 false。元素比較大小是通過<運算符進行的。a != b:等價于 !(a == b)。a > b:等價于 b < a。a <= b:等價于 !(b < a)。a >= b:等價于 !(a < b)。所有容器都有以下兩個成員函數:
int size():返回容器對象中元素的個數。bool empty():判斷容器對象是否為空。順序容器和關聯容器還有以下成員函數:
begin():返回指向容器中第一個元素的迭代器。end():返回指向容器中最后一個元素后面的位置的迭代器。rbegin():返回指向容器中最后一個元素的反向迭代器。rend():返回指向容器中第一個元素前面的位置的反向迭代器。erase(...):從容器中刪除一個或幾個元素。該函數參數較復雜,此處省略。clear():從容器中刪除所有元素。如果一個容器是空的,則 begin() 和 end() 的返回值相等,rbegin() 和 rend() 的返回值也相等。
順序容器還有以下常用成員函數:
front():返回容器中第一個元素的引用。back():返回容器中最后一個元素的引用。push_back():在容器末尾增加新元素。pop_back():刪除容器末尾的元素。insert(...):插入一個或多個元素。該函數參數較復雜,此處省略。總結
- 上一篇: Pycharm 项目运行的多种技巧
- 下一篇: Java @SafeVarargs注解