標籤:而不是 變數 運算式 queue ptr 相同 引用 未命名 實現
訪問成員函數返回的是引用,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容器