STL容器共通能力與通用操作

1 容器的共通能力


  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ì)待它們。
  2. 總體而言,所有元素形成一個(gè)次序,也就是說(shuō),你可以依相同次序一次或多次遍歷每個(gè)元素。每個(gè)容器都提供可返回迭代器的函數(shù),運(yùn)用那些迭代器你就可以遍歷元素。這是STL算法賴以生存的關(guān)鍵接口。
  3. 一般而言,各項(xiàng)操作并非絕對(duì)安全。調(diào)用者必須確保傳給操作函數(shù)的參數(shù)符合需求。違反這些需求會(huì)導(dǎo)致未定義的行為。通常STL自己不會(huì)拋出異常。如果STL容器所調(diào)用的使用者自定操作拋出異常,會(huì)導(dǎo)致不相同的行為。

2 容器的共通操作


1.jpg
  1. 以另一個(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());
    
  2. 以某個(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]));
    
  3. 以標(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ù)雜度為“線性”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容