容器簡介 and Vector。本站提示廣大學習愛好者:(容器簡介 and Vector)文章只能為提供參考,不一定能成為您想要的結果。以下是容器簡介 and Vector正文
[TOC]
6.1 容器的共通才能和共通操作 1. 共通才能1. 一切容器提供都是“value語意”而非“reference語意”。容器停止元素的安插操作時,外部施行的是copy操作,置於容器內。因而STL容器的每一個元素都必需可以被拷貝。 2. 一切元素構成一個次第。 3. 各項操作並非相對平安。2.共通操作
初始化,每個容器類別都提供一個default結構函數,一個copy結構函數和一個析構函數。
ContType c //發生一個未含任何元素的空容器 ContType c1(c2) //發生一個同型容器 ContType c(beg, end) //復制[beg,end]區間內的元素,作為容器初值 c.~ContType() //刪除一切元素,釋放內存 c.size() //前往容器中的元素數量 c.empty() //判別容器能否為空 c.max_size() //前往元素的最大能夠數量 c1 == c2 c1 != c2 c1 < c2 c1 > c2 c1 <= c2 c1 >= c2 c1.swap(c2) //交流c1和c2的數據 swap(c1, c2) //同上,是個全局函數 c.begin() c.end() c.rbegin() c.rend() c.insert(pos, elem) c.erase(beg, end) c.clear() c.get_allocator() //前往容器的內存模型
size()
、empty()
、max_size()
。賦值和swap
當你對著容器復制元素時,源容器的一切元素被拷貝到目的容器內,後者原來的一切元素全被移除。所以,容器的賦值操作代價比擬昂揚。 假如兩個容器型別相反,而且拷貝後源容器不再被運用,那麼我們可以運用一個復雜優化的辦法:swap。現實上它只交流某些外部指針。
運用vector之前,必需包括#include <vector>
。其中,vector聲明在std。
namespace std { template <class T, class Allocator = allocator<T>> class vector; }1.vector的才能
大小和容量。vector優良功能的秘訣之一,就是配置比其所包容的元素所需求更多的內存。
vector之中用於操作大小的函數有size、empty、max_size。另一個與大小有關的函數是capacity,它前往vector實踐可以包容的元素數量。假如超越這個數量,vector就有必要重新分配外部貯存器。
vector的容量之所以很重要,有以下兩個緣由:
你可以運用reserve()
保存適當容量,防止一再重新配置內存。另一種防止重新配置內存的辦法是,初始化時期就向結構函數傳遞附加參數,結構出足夠的空間。為了獲取這種才能,必需提供一個default結構函數。假如型別復雜,就算提供了default結構函數,初始化操作也很耗時,假如你只不過為了保存足夠的內存,那倒不如運用reserve。
安插操作能夠使ref、pointer、iterator生效。由於能夠招致重新配置空間。
上面有個直接所見vector容量的小訣竅。
std::vector<T>(v).swap(v)
swap後,ref等都會生效。
2. Vector的操作函數結構、拷貝和析構
vector<Elem> c vector<Elem> c1(c2) vector<Elem> c(n) vector<Elem> c(n, elem) //發生一個大小為n的vector,每個元素都是elem vector<Elem> c(beg, end) c.~vector<Elem>()
非變化性操作
c.size() c.empty() c.max_size() capacity() reserve() c1 == c2 c1 != c2 c1 < c2 c1 > c2 c1 <= c2 c1 >= c2
賦值
c1 = c2 c.assign(n, elem) c.assign(beg, end) c1.swap(c2) swap(c1, c2)
元素存取,不作邊界反省。
c.at(idx) c[idx] c.front() c.back()
迭代器相關函數
c.begin() c.end() c.rbegin() c.rend()
安插和移除元素
c.insert(pos, elem) c.insert(pos, n, elem) c.insert(pos, beg, end) c.push_back() c.erase(pos) c.erase(beg, end) c.resize(num) c.resize(num ,elem) c.clear()
vector並未提供任何函數可以直接移除“與某值相等”的一切元素,以下可以移除一切val:
col1.erase(remove(col1.begin(), col1.end(), val), col1.end());3. 異常處置
假如vector調用的函數拋出異常,C++規范順序庫做出如下保證:
一切這些保證都基於一個條件:析構函數不得拋出異常。
4.Class vector<bool>
目的是獲取一個優化的vector,其耗用空間遠遠小於普通vector生成的bool vector。
假如你需求靜態大小的bitfield,該當運用bitset。
vector<bool>
的特殊操作
c.flip() m[idx].flip() m[idx] = val m[idx1] = m[idx2]
參考: