順序容器,它將單一類型元素聚集起來成為容器,然后根據位置來存儲和訪問這些元素,這就是順序容器。標準庫里定義了三種類型:vector(支持快速隨機訪問)、list(支持快速插入、刪除)、deque(雙端隊列)容器只定義了少量操作,大多數額外的操作由算法庫提供。容器內元素的類型約束;1、元素類型必須支持賦值運算;2、元素類型的對象必須可以復制。這是容器元素類型的最低要求,如果想支持一些其他特殊要求,則必須具備相關的性質。
可以定義容器的容器vector< vector<int> > lines;//必須使用"> >"中間的空格,否則會出現變異錯誤
迭代器運算:
關系操作符只適用于vector和deque容器,它們可以根據元素位置直接有效地訪問指定的容器元素。而list容器的迭代器既不支持算術運算(加法或者減法),也不支持關系運算(<=,<,>=,>),它只提供前置和后置的自增、自減運算以及相等(不等)運算。
迭代器范圍:
c++使用一對迭代器標記迭代器范圍,通常命名為first和last或beg和end。該范圍內的元素包括迭代器first指向的元素,以及從first開始一直到迭代器last指向的位置之前的所有元素,此類元素范圍稱為左閉合區間[first,last)。
順序容器的操作:
在容器中添加元素;在容器中刪除元素;設置容器大??;獲取容器內的第一個和最后一個元素。對于begin()、end()、rbegin()、 rend()四個操作,均有const版本。如果容器時const,則其返回類型要加上const_前綴。c.push_back(t) 在容器c的尾部添加值為t的元素,返回void類型。c.push_front(t) 在容器c的前端添加值為t的元素,返回void類型。但是只有list和deque具有這樣的性質。
關鍵概念:容器元素都是副本在容器中添加元素時,系統是將元素值復制到容器里。類似的,使用一段元素初始化新容器時,新容器存放的事原始元素的副本。本復制的原始值與新容器中的元素各不相干,此后,容器內元素值發生變化時,被復制的原值不會受到影響,反之亦然。
容器的比較:
比較的容器必須具有相同的容器類型,而且其元素類型也必須相同。容器的比較式基于容器內元素的比較。兩個容器具有相同的長度而且所有的元素都相等,那么這兩個容器就相等。如果兩個容器長度不相等,但較短的容器中所有元素都等于較長容器中對應的元素,則稱較短的容器小于另一個容器。如果兩個容器都是對方的初始子序列,則它們的比較結果取決于所比較的第一個不相等的元素。
容器類型提供resize函數來改變容器所包含的元素個數。如果當前的容器長度大于新的長度值,則該容器后部的元素會被刪除,如果當前的容器長度小于新的長度值,則系統會在該容器后部添加新元素。resize操作可能會使迭代器失效。例子:
如果容器非空,那么容器類型的front和back成員將返回容器內第一個或最后一個元素的引用
pop_front和pop_back函數用于刪除容器內的第一個和最后一個元素。
刪除一個或者一段元素更通用的方法是用erase操作,有兩個版本:刪除由一個迭代器指向的單個元素,或刪除由一對迭代器標記的一段元素。erase返回一個迭代器,它指向被刪除元素或元素段后面的元素。通常,必須在容器中查找要刪除的元素后,才使用erase操作。尋找一個指定元素最簡單的方法,是使用標準庫中的find方法。必須包含頭文件algorithm.h
#include<algorithm>
list<int>::iterator searchIter= find(mylist.begin(),mylist.end(),1233);
if(searchIter!=mylist.end())//有可能找不到
{
mylist.erase(searchIter);
}
容器的選用:
vector和deque容器提供了對元素的快速隨機訪問,但付出的代價是,在容器的任意位置插入或刪除元素,比在容器尾部插入和刪除元素的開銷更大。list類型在任何位置都能快速插入和刪除,但付出的代價是元素的隨機訪問開銷較大。其原因就是在內部實現的數據結構中,一個是在內存中順序地址分批的,而另一個是在類似鏈表的方式,隨機地址分配的,所以導致性質的不同。
新聞熱點
疑難解答
圖片精選