1.map和set有什麼區別,分別又是怎麼實現的?2.stl的allocator?
c++容器的空間配置器,由兩級分配器構成,大於128位元組,呼叫一級配置器,malloc/free,realloc;小於128位元組,預設二級配置器,分配記憶體池。為了便於記憶體管理,減少記憶體碎片產生
3.stl(標準模板庫)有什麼基本組成
stl主要由:以下幾部分組成:
1)容器(container),是一種資料結構,如list,vector,和deques ,以模板類的方法提供。為了訪問容器中的資料,可以使用由容器類輸出的迭代器;
2)迭代器(iterator),提供了訪問容器中物件的方法。例如,可以使用一對迭代器指定list或vector中的一定範圍的物件。迭代器就如同乙個指標。事實上,c++的指標也是一種迭代器。但是,迭代器也可以是那些定義了operator*()以及其他類似於指標的操作符地方法的類物件;
3)演算法(algorithm),是用來操作容器中的資料的模板函式。例如,stl用sort()來對乙個vector中的資料進行排序,用find()來搜尋乙個list中的物件,函式本身與他們操作的資料的結構和型別無關,因此他們可以在從簡單陣列到高度複雜容器的任何資料結構上使用;
4)仿函式(function object)
5)迭代介面卡(adaptor)
6)空間配製器(allocator)
他們之間的關係:分配器給容器分配儲存空間,演算法通過迭代器獲取容器中的內容,仿函式可以協助演算法完成各種操作,配接器用來套接適配仿函式
4.multimap和map的區別
1、multimap中的key可以重複
2、multimap中沒有過載operator[ ]功能
5.vector和list的區別
1)vector
連續儲存的容器,動態陣列,在堆上分配空間
底層實現:陣列
兩倍容量增長:
vector 增加(插入)新元素時,如果未超過當時的容量,則還有剩餘空間,那麼直接新增到最後(插入指定位置),然後調整迭代器。
如果沒有剩餘空間了,則會重新配置原有元素個數的兩倍空間,然後將原空間元素通過複製的方式初始化新空間,再向新空間增加元素,最後析構並釋放原空間,之前的迭代器會失效。
效能:訪問:o(1)
插入:在最後插入(空間夠):很快
在最後插入(空間不夠):需要記憶體申請和釋放,以及對之前資料進行拷貝。
在中間插入(空間夠):記憶體拷貝
在中間插入(空間不夠):需要記憶體申請和釋放,以及對之前資料進行拷貝。
刪除:在最後刪除:很快
在中間刪除:記憶體拷貝
適用場景:經常隨機訪問,且不經常對非尾節點進行插入刪除。
2、list
動態鍊錶,在堆上分配空間,每插入乙個元數都會分配空間,每刪除乙個元素都會釋放空間。
底層:雙向鍊錶
效能:訪問:隨機訪問效能很差,只能快速訪問頭尾節點。
插入:很快,一般是常數開銷
刪除:很快,一般是常數開銷
適用場景:經常插入刪除大量資料
6.迭代器和指標的區別
迭代器不是指標,是類模板,表現的像指標。他只是模擬了指標的一些功能。迭代器封裝了指標,是乙個「可遍歷stl( standard template library)容器內全部或部分元素」的物件, 本質是封裝了原生指標,是指標概念的一種提公升(lift),提供了比指標更高階的行為,他可以根據不同型別的資料結構來實現不同的++,–等操作。
迭代器返回的是物件引用而不是物件的值,所以cout只能輸出迭代器使用*取值後的值而不能直接輸出其自身。
iterator類的訪問方式就是把不同集合類的訪問邏輯抽象出來,使得不用暴露集合內部的結構而達到迴圈遍歷集合的效果。
7.迭代器的使用,如刪除元素、增加元素
刪除元素
std::vector<
int> vec;
std::vector<
int>
::iterator itvec;
for( itvec = vec.
begin()
; itvec != vec.
end();
)else
itlist++
;}
對vector、queue等,每次erase操作,函式會刪除指定迭代器位置的元素,然後將後面的元素前移一位,erase返回指向被刪除元素下一元素的迭代器。
增加元素,原有vector為{1,2,3,4,5},現在要在每個元素前加乙個8,使vector變為{8,1,8,2,8,3,8,4,8,5}.
#include
#include
using
namespace std;
intmain()
;auto iter = vec.
begin()
;for
(; iter != vec.
end();
)for
(auto num : vec)
cout << num << endl;
return0;
}
insert會將指定物件插入指定迭代器之前的位置,並返回這個位置的迭代器,要想該迭代器指向之前的下乙個元素,需要遞增兩次
8.stl容器中resize和reserve的區別
resize():改變當前容器內含有元素的數量(size()),eg: vectorv; v.resize(len);v的size變為len,如果原來v的size小於len,那麼容器新增(len-size)個元素,元素的值為預設為0.當v.push_back(3);之後,則是3是放在了v的末尾,即下標為len,此時容器是size為len+1;
reserve():改變當前容器的最大容量(capacity),它不會生成元素,只是確定這個容器允許放入多少物件,如果reserve(len)的值大於當前的capacity(),那麼會重新分配一塊能存len個物件的空間,然後把之前v.size()個物件通過copy construtor複製過來,銷毀之前的記憶體;
#include
#include
using
namespace std;
intmain()
C 容器和演算法
c 容器和演算法 容器部分 順序容器 vector deque list 通過元素在容器中的位置順序儲存和訪問元素 vector 支援快速隨機訪問 容器介面卡為stack後進先出棧 deque 雙端佇列 容器介面卡為priority queue有優先順序管理的佇列 list 支援快速插入 刪除 容器...
C 基礎 容器和演算法
1 map和set有什麼區別,怎麼是寫的 都是關聯容器,底層實現都是紅黑樹 區別在於 2 介紹一下stl的allocator stl的分配器用於封裝stl容器在記憶體管理上的底層細節在c 中,其記憶體配置和釋放如下 new運算分兩個階段 1 呼叫 operator new配置記憶體 2 呼叫物件建構...
容器和演算法
在我們編寫每乙個程式時,都會或多或少的需要儲存一些資料,而c 在這方面只提供了幾種最基本的方法,我們可以建立區域性變數或者全域性變數在存放某個值,也可以用陣列來存放多個值。陣列是c 唯一支援的容器,但陣列並不適合用來解決所有的問題 假如我們編寫乙個程式 輸入一串字母,判斷與給定單詞是否一樣。這時候我...