1. 程式人生 > >C++primer容器

C++primer容器

成員函數 運行 array 增刪 都是 安排 auto 參考 方法

訪問成員函數返回的是引用,front,back,at,和下表,如果一個容器是const,返回的則是const的引用,如果容器不是const,則返回的是普通引用。

是否返回的是引用,關鍵是看表達式在左值還是在右值,如果在右值,返回的就是元素的一個拷貝,如果在左值,返回的是一個引用對象。

在使用auto的時候,如果想改變該變量的值,要定義成引用類型。

這裏指的指針,引用,叠代器實效,說的是可能改變容器的大小。

刪除元素的成員函數並不檢測其刪除參數,在刪除元素之前,應該確保它們是存在的。

auto的自動推斷類型發生在編譯器,因此,auto並不會造成程序運行效率的低下。

在未使用auto的時候,編譯器同樣需要得知右操作數的類型,然後在與左操作數類型進行比較,檢查是否可以發生相應的轉化,是否需要進行隱式類型轉化。

在使用auto的時候,如果表達式中有引用的含義,則會去除引用的含義,直接對應最原始的數據類型,

auto會去除頂層const,如果auto帶上引用,則不會去除const修飾符所帶來的作用。

初始值為數組,則使用auto得到的是指針類型,如果帶上&,則推導類型為數組類型。

auto並不是一個真正的類型,而是一個占位符,因此不能使用一些以類型為操作數的操作符,如sizeof或者是typeid。

在使用forword_list的時候,需要用到兩個叠代器對象,一個是要操作的元素,另外一個是該元素前驅元素。

標準庫中的array不支持resize操作,其他的resize操作都是在原來容器的基礎之上。

shrink_to_fit僅僅是一個請求,編譯器並不一定保證會真正的回退內存空間。

棧默認是基於deque來進行實現的,也可以在list和vector上面實現。

每個適配器都是根據底層來實現自己的操作,不可以直接使用底層操作,這裏相當於是對底層操作的一個限制。

queue默認也是基於deque來實現的。

priority_queue是基於vector來實現的。

標準庫算法是對叠代器進行操作而不是對容器進行操作,因此,算法並不能直接對容器進行增刪

C++中的可調用對象有函數,函數指針,操作符重載,以及使用lambda表達式。

lambda表達式所具有的形式:

[捕獲列表](參數列表) -> 返回類型 {函數體}

其中捕獲列表是在函數體中定義的局部變量的列表,通常為空,

lambda必須使用尾置返回用來指定其返回類型。

我們可以忽略參數列表和返回類型,但必須永遠包括捕獲列表和函數體

在lambda表達式中,忽略括號和參數列表等價於定義一個空參數列表,如果忽略返回類型,會自動根據函數體中的代碼推斷出返回類型。如果函數體中包含return語句,則根據來推斷,否則,返回void類型。

lambda表達式不能有默認參數,lambda表達式的實參數目必須和形參數目相同,一旦形參初始化完畢,就可以直行函數體了。lambda就像是一個匿名的內聯函數。

捕獲列表的存在使得,函數體內可以訪問捕獲列表中的值。

當定義一個lambda的時候,編譯器會生成一個對應新的未命名的類類型,當向一個函數傳遞lambda的時候,同時定義了一個新類型,和一個該類型的對象,傳遞的參數就是此編譯器生成該類類型的未命名的對象,類似的,當使用auto定義一個用lambda初始化的變量,定義了一個從lambda生成的類型的對象。

默認情況下,由lambda生成的對象,都包含用lambda捕獲列表所捕獲變量的數據成員,類似於普通函數,lambda的數據成員在lambda對象被創建的時候進行初始化。

被捕獲的值是在lambda創建時拷貝,而不是調用時拷貝。

使用bind(functional頭文件中)可以,擴展函數調用時候的參數(前提是參數的值是固定的)

bind函數甚至是可以重新安排參數的順序

對於IO流的對象來講,只能使用引用類型。

可以通過ref標準庫中的函數,返回給定對象的引用,這個對象是可以拷貝的。標準庫中有一個cref函數,生成一個保存const引用的類,這兩個函數也位於functional頭文件中。

容器這一塊,需要自己來慢慢參考算法來進行實現

動態內存管理

永遠不要用get()方法返回的指針為其他只能指針賦值,這樣會導致有多個只能指針指向同一塊內存空間,從而使得,任何一個只能指針的引用為0,都會將這塊內存空間給釋放掉,因此,另外的指針所指向的內存空間也被釋放掉了,這就會導致空懸指針。

只能指針的一種類型有,shared_ptr,也是用模板類定義的

智能指針使用的條件限制:

不使用相同的內置指針初始化多個智能指針

不delete get()返回的指針。

不適用get()初始化後者是reset另一個智能指針

如果使用了get()返回的指針,當最後一個智能指針被銷毀以後,你的指針就變得無效了。

如果智能指針管理的資源不是new分配的內存,記得傳遞一個刪除器,用來專門釋放相應的內存資源。

C++primer容器