C++容器的拷貝注意細節

  1. 爲了創建一個容器爲另一個容器的拷貝,兩個容器的類型以及元素類型必須匹配。當傳遞參數爲兩個迭代參數用來拷貝時,就不需要容器類型是相同的了,而且嚴肅類型也不要求是相同的,只需要將考別的嚴肅轉換爲對應的元素類型即可。如圖中實例:
    這裏寫圖片描述

  2. c爲一容器,c= {a,b,c,d,e,f…}將c種元素替換爲初始化列表中的數據,但是對array不適用。

  3. 採用swap函數交換兩個容器的元素時,對vector等元素不會移動,故其迭代器仍然有效,且減緩時間非常快,是一個常熟時間,但是對array的swap函數就會真正交換他們的元素,故交換時間與他們所含元素的數量成正比,交換後迭代器指向的已經是另一個array中所指向的元素了。即指向的值發生了改變。
  4. swap函數有層原函數版本和非成員函數版本,推薦非成員函數版本,即swap(c1,c2);版本。
  5. 當我們用一個對象來初始化容器時,或者將一個對象插入到容器中時,司機上放入容器的是對象的拷貝,而不是對象本身,這與我們將對象傳遞給非引用參數一樣,對容器中元素的修改不會影響到原始對象。
  6. 解引用c.end()–才能夠得到容器最後一個元素,c.end()指向的是最後一個元素的後一個位置。
  7. at()操作只支持vector、deque、array、string不支持list。可以這樣裏理解,at爲隨機訪問,而list爲鏈式存儲,故不支持。
  8. 當進行大多數操作時,容器的尾後迭代器都會失效,故不要保存end返回的迭代器,而應該每次處理完相應的模塊後均從新定位尾後迭代器。否則會產生災難性後果。如下代碼:
//不安全,迭代器失效
auto beg = v.begin();
auto end = v.end();
while(beg!= end){
    beg = v.insert(beg,21);
    ++beg;
}


//正確的寫法
while(beg!= v.end()){//每次從新定位尾後迭代器
    beg = v.insert(beg,21);
    ++beg;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章