1. 程式人生 > >C++ Primer 筆記——容器

C++ Primer 筆記——容器

div 沒有 string 標準庫 靈活 reserve image 叠代 容量

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 筆記——容器