1 容器的共通能力
- 所有容器提供的都是value語(yǔ)義,而非reference語(yǔ)義。容器進(jìn)行元素的安插操作時(shí),內(nèi)部實(shí)施的是拷貝操作,至于容器內(nèi)。因此STL容器的每一個(gè)元素必須能被拷貝。如果你打算存放的對(duì)象不具有public copy構(gòu)造函數(shù),或者你想要的不是副本,那么容器元素只能是指針,而此時(shí)你必須非常謹(jǐn)慎的對(duì)待它們。
- 總體而言,所有元素形成一個(gè)次序,也就是說(shuō),你可以依相同次序一次或多次遍歷每個(gè)元素。每個(gè)容器都提供可返回迭代器的函數(shù),運(yùn)用那些迭代器你就可以遍歷元素。這是STL算法賴以生存的關(guān)鍵接口。
- 一般而言,各項(xiàng)操作并非絕對(duì)安全。調(diào)用者必須確保傳給操作函數(shù)的參數(shù)符合需求。違反這些需求會(huì)導(dǎo)致未定義的行為。通常STL自己不會(huì)拋出異常。如果STL容器所調(diào)用的使用者自定操作拋出異常,會(huì)導(dǎo)致不相同的行為。
2 容器的共通操作

1.jpg
-
以另一個(gè)容器的元素為初值,完成初始化操作:
std::list<int> l; //l is a linked list of ints ... //copy all elements of the list as floats into a vector std::vector<float> c(l.begin(),l.end()); -
以某個(gè)數(shù)組的元素為初值,完成初始化操作:
int array[] = { 2, 3, 17, 33, 45, 77 }; ... //copy all elements of the array into a set std::set<int> c(array,array+sizeof(array)/sizeof(array[0])); -
以標(biāo)準(zhǔn)輸入裝置完成初始化操作:
//read all integer elements of the deque from standard input std::deque<int> c((std::istream_iterator<int>(std::cin)), (std::istream_iterator<int>()));
原則上還有一些操作,可支持從另一區(qū)間獲取數(shù)據(jù)、賦值、插入元素。不過這些操作的確切接口在各容器中彼此不同,有不同的附加參數(shù)。
賦值和swap()
當(dāng)你對(duì)容器賦值元素時(shí),源容器的所有元素被拷貝到目標(biāo)容器內(nèi),后者原本的所有元素全被移除。所以,容器的賦值操作代價(jià)比較高昂。
如果兩個(gè)容器的型別相同,而且拷貝后源容器不再使用,那么我們可以使用swap優(yōu)化。其性能比上述優(yōu)異的多,因?yàn)樗唤粨Q容器的內(nèi)部數(shù)據(jù)。事實(shí)上它只交換某些內(nèi)部指針,所以時(shí)間復(fù)雜度是“常數(shù)”,不像實(shí)際賦值操作的復(fù)雜度為“線性”。