C++ Primer 筆記——容器

來源:互聯網
上載者:User

標籤:fit   images   儲存   swap   blog   name   auto   返回   ++   

1.標準庫中定義了一些順序容器,所有順序容器都提供了快速順序訪問元素的能力。

 

2.如果容器的元素類型沒有預設建構函式,那麼在構造這個容器的時候不能只指定這個容器的數目,因為沒有辦法預設構造這些元素。

 

3.常見的一些容器操作

 

4.當一個容器初始化另一個容器拷貝時,兩個容器的元素類型必須完全符合,如果用一個容器的迭代器去初始化另一個容器時,只要元素類型可以轉換即可。

 

 5.當定義一個array時除了指定類型之外還要定義它的大小,array可以進行拷貝賦值。

std::array<int, 3> arr = {1, 2, 3};std::array<int, 3>::iterator iter;std::array<int, 3> arr1 = arr;

 

6.容器的賦值運算。

 

7.assign(array不可用)可以為類型不同但是相容的容器賦值。

std::list<std::string> names;std::vector<const char*> oldstyle;names = oldstyle;        // 錯誤,類型不同names.assign(oldstyle.cbegin(), oldstyle.cend());

 

8.除array外,swap不對任何元素進行拷貝,刪除或插入操作,因此可以保證在常數時間完成。

  • 元素不被移動意味著,除string外,指向容器的迭代器,引用和指標在swap操作之後都不會失效,但是已經指向的容器已經隨著元素髮生變化。
  • 對string調用swap會導致迭代器,引用和指標失效。
  • swap兩個array會真正交換它們的元素,因此交換兩個array所需的時間與array的元素數目成正比,而且指標,引用和迭代器所綁定的元素保持不變,但元素的值變了。

 

9.關係運算子兩邊的運算對象必須是相同類型的容器,且必須儲存相同類型的元素。而且只有當元素類型定義了相應的比較子才可以比較,比較方式和string類似。

 

10.除array外,所有標準庫容器都提供靈活的記憶體管理。

 

11.當我們用一個對象來初始化容器時,或將一個對象插入到容器中時,實際上放入到容器中的是對象值得一個拷貝。

 

12.在新標準下,接受元素個數或範圍的insert版本返回指向第一個新加入元素的迭代器,如果範圍為空白,不插入任何元素,insert操作會將第一個參數返回。

std::list<int> ls;int i;auto iter = ls.begin();while (std::cin >> i)    iter = ls.insert(iter, i);    // 等價於調用push_front

 

13.emplace函數在容器中直接構造元素,傳遞給emplace函數的參數必須與元素類型的建構函式相匹配。

 

14.在順序容器中訪問元素的操作如下,而且下面操作返回的都是引用,如果容器是const的對象,則傳回值是const引用。

 

15.順序容器的刪除操作。

 

16.在一個forward_list中添加或刪除元素的操作是通過改變給定元素之後的元素來完成的,所以forward_list沒有insert,emplace和erase,而是定義了一些其他動作。

 

17.除了array外,可以用resize來增大或縮小容器。如果當前大小大於所要求大小,則多餘的會被刪除,反之會增加新元素到尾部。

 

18.向容器中添加或刪除元素可能會使指向容器元素的指標,引用或迭代器失效。

向容器添加元素之後 :

  • 如果容器是string或vector,且儲存空間被重新分配,則都會失效,如果未重新分配,則指向插入位置之前的仍然有效,插入位置之後的會失效。
  • 對於deque,插入到除首尾位置之外的任何位置都會失效,如果在首尾位置添加元素,迭代器會失效,但指向存在元素的指標和引用不會失效。
  • 對於list和forward_list,仍然有效。

從容器中刪除元素後:

  • 對於vector和string,指向被刪除元素之前的仍然有效。注意:尾後迭代器總是會失效。
  • 對於deque,如果在首尾位置之外的任何位置刪除元素,指向被刪除元素外其他元素的會失效,如果刪除的是尾元素,則尾後迭代器會失效,但其他的不受影響。如果刪除首元素,也不會受影響
  • 對於list和forward_list,仍然有效。

 

19.範圍for語句體內不應該改變其所遍曆序列的大小,因為一旦添加或刪除元素,用來判斷結束的end()函數的值可能變得無效了。

 

20.vector元素的儲存是連續的,當增加元素的時候如果連續的記憶體空間不夠,則會重新分配空間。string和vector通常會預留空間作為預備。定義vector對象的時候設定其大小也就沒什麼必要了,事實上如果這麼做效能可能更差。只有一種例外情況,就是所有元素的值都一樣。

 

21.管理容量的成員函數。

reserve至少會分配指定大小的空間,但是可能更大,而且當參數小於當前容量的時候,reserve什麼也不做。

shrink_to_fit只是一個請求,標準庫並不保證退還記憶體。

只有在insert操作時size()和capacity()相等或調用reserve時才會重新分配記憶體,會分配多少取決於實現。

 

22.修改string的操作。

 

23.string的搜尋操作。

 

C++ Primer 筆記——容器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.