vector中國官網(wǎng) C 的vector是怎么實現(xiàn)的?是靠鏈表嗎?
C 的vector是怎么實現(xiàn)的?是靠鏈表嗎?這是要翻的源代碼,STL代碼說實話,真的不懂。如果您不太關(guān)心細節(jié),可以簡單介紹一下基本的實現(xiàn)思想,大致如下:1。Vector是一個順序存儲容器,因此底層實
C 的vector是怎么實現(xiàn)的?是靠鏈表嗎?
這是要翻的源代碼,STL代碼說實話,真的不懂。
如果您不太關(guān)心細節(jié),可以簡單介紹一下基本的實現(xiàn)思想,大致如下:
1。Vector是一個順序存儲容器,因此底層實現(xiàn)通?;跀?shù)組。
2. 向量的實現(xiàn)采用模板元編程技術(shù)。具體來說,編譯器在編譯時根據(jù)使用時指定的實際類型執(zhí)行模板專門化,并編譯相應(yīng)的代碼。也就是說,向量
3。矢量的一個重要特性是實現(xiàn)陣列的動態(tài)增量。簡單地說,就是記錄容器內(nèi)當前的最大容量和使用量。在添加元素時,如果container類發(fā)現(xiàn)當前容量已經(jīng)耗盡,container類會自動重新分配一個容量更大的數(shù)組,復制當前所有的元素,然后釋放原來的數(shù)組,從而實現(xiàn)動態(tài)自動遞增,對用戶完全透明。
4. Vector提供了迭代器來提供統(tǒng)一的遍歷訪問接口,以便于與STL中的其他組件進行交互。
將會有很多細節(jié),例如:
1。是否允許vector在必要時減少其容量?
2. 向量容量耗盡后的增量是多少?
3. 是否應(yīng)提供線程安全容器?
有些東西可能真的需要看源代碼才能理解。也可以參考侯杰的STL源代碼分析。其實向量本身的實現(xiàn)并不是太復雜,其實現(xiàn)思想也很簡單,但在設(shè)計層面的一些權(quán)衡需要慎重考慮。一般來說,STL是一個足夠強大的后盾,我們會經(jīng)常使用它來構(gòu)建健壯高效的軟件。了解STL的一些設(shè)計思想和實現(xiàn)方法,有助于提高我們的編程思維和編程能力。
vector如何實現(xiàn)快速查找?
數(shù)據(jù)結(jié)構(gòu)如下:C/C代碼、rstring username、rstring userotherinfo}、rvector<userinfo userlist?,F(xiàn)在的問題是,您希望根據(jù)輸入條件在這樣的向量中快速找到元素。條件可以是userid、username或userotherinfo中的任意一個(例如,如果您查找用戶名為XXX的元素,可能會有多個結(jié)果)。R在查找userotherinfo時,通常會匹配前幾個字符(類似于數(shù)據(jù)庫,例如userotherinfo,如“XX%”)R------------解決方案--------然后不要使用vector,map或set是紅黑樹,查找日志最快的方法是哈希查找。但是,構(gòu)建哈希表有點麻煩。解決方案是:如果目的是直接查找,最好使用關(guān)聯(lián)的容器。另一個建議是直接使用SQLite的內(nèi)存數(shù)據(jù)庫。其用法與哲學數(shù)據(jù)庫完全相同。唯一的區(qū)別是它內(nèi)置在內(nèi)存中,操作效率相當高。我在處理大數(shù)據(jù)時總是這么做。R使用三個向量來保存他的迭代器。然后將三個向量按三個成員進行排序,最后進行二值搜索。復雜性日志(n)]~]//向量交換.cpp
//compile with:/EHsc
#include
#include
int main()
{
using namespace std
vector
v1.push|back(1)
v1.push|back(2)
v1.push|back(3)
v2.push|back(10)
v2.push|back(20)
cout
cout
v1.swap(v2)
cout
cout
}