C 標準模板庫元件介紹

2021-06-09 15:07:46 字數 4860 閱讀 9320

在前幾天的阿里面試過程中,問到了我標準模板庫的繼承體系。平時開發對vector,list, map,set ,stack等容器用的比較多,但是沒有深入研究過。經歷過面試,發現了很多需要完善和提高的地方。

但是有個問題哦,標準模板庫中得幾大元件沒有啥繼承關係,只是說有某些容器之間有適配關係。

所謂容器,就是存放資料的倉庫,定義了資料在記憶體中的組織方式,

主要:有序列式容器(線性資料結構)、關聯連式容器(非線性資料結構:樹結構)

序列容器,典型的容器vector,相對於c++內嵌的陣列,vector的優點是支援資料的動態擴充套件。

而空間的動態擴充套件,有空間配置器配置。它會為容器提供空間分配的策略,比如空間不夠時增長的幅度。

迭代器統一了容器的訪問操作,很好的東西。想到了迭代器模式

view source

print?

1containercons;

2for(container::iterator iter = cons.begin();

3iter != cons.end(); iter++)

4

看看《stl原始碼分析》中關於vector的定義

view source

print?

1template<classt,classalloc = alloc>

2classvector

3

這裡很明顯的是通過typedef定義將指標定義為vector的迭代器,提供統一訪問,但是本質上還是指標哈。

vc的vector的迭代器定義:是乙個類哈,有許多資料組成了迭代器的定義,其中有指標,有引用。

view source

print?

01template<class_myvec>

02class_vector_iterator

03:public_vector_const_iterator<_myvec>

04

pointer定義,就是某個資料型別的指標

view source

print?

1typedefvalue_type _farq *pointer;

再看下hashtable中的迭代器的定義:

view source

print?

1......

2struct_hashtable_iterator

3

在hashtable迭代器中,有兩個指標,一是當前節點的指標,二是buckets vector的指標。

綜上所述,所謂迭代器,就是對指標以及其他輔助資訊的乙個封裝。對資料的訪問一定是通過位址訪問,位址是必須的,所以位址是迭代器中不可缺少的資訊。

在迭代器的使用中,常常遇到的乙個問題就是,在進行資料的插入刪除時的失效問題!其實就是指標的問題哈

空間配置器用於遮蔽容器關於記憶體管理的細節。比如容器記憶體的申請釋放,當記憶體不夠時採用怎樣的一種策略。在我們平常的使用中,

view source

print?

1vectorstus;

並沒有制定容器的空間配置方案,於是採用預設的配置方案,其實我們是可以自己編寫空間配置方案,並將該方案實施於某個容器。(customalloc是自定義的命名空間,並實現了空間配置方案allocator)

view source

print?

1vector<int, customalloc::allocator<int>> datas;

可以在自定義的方案中進行記憶體管理。

提供了大量常用、通過的演算法,比如比較、查詢、資料移動、複製、交換等等。

基礎演算法:min, max, swap

排序:sort

替換:replace

查詢:find

此處不一一枚舉

函式物件,簡單的理解就是將乙個函式封裝為物件,但是它的作用是為容器的操作提供依據。我進行比較大小,根據什麼比,函式物件提供,查詢,匹配的規則是什麼,函式物件提供。 

例如:

1. 對vector容器進行排序,排序的標準是?

2. 對容器中得資料進行查詢,查詢的標準是?

通過函式物件,可以靈活的編寫操作依據,並注入到操作函式中。

為sort函式編寫compare()

為find_if編寫query()

此處寫了個例項,說明一下用法:

業務物件定義:

view source

print?

01classstudent

02

12

13student(conststudent &stu)

14

17

18student& operator=(conststudent &stu)

19

24};

函式物件定義,說明物件之間比較的依據,此處依據是年齡

view source

print?

01structcompare :publicstd::binary_function

02

10};

測試程式:

view source

print?

01int_tmain(intargc, _tchar* argv)

02

15

16for(vector::iterator iter = stus.begin(); iter != stus.end(); iter++)

17cout"--"<< iter->age<

18cout<<"-----------------------------"<

19sort(stus.begin(), stus.end(),  compare());

20for(vector::iterator iter = stus.begin(); iter != stus.end(); iter++)

21cout"--"<< iter->age<

22

23getchar();

24return0;

25}

測試結果:將原本隨機插入的資料根據年齡進行了排序

注:此處是對幾個元件的簡要說明,並未詳細深入

C 標準模板庫介紹

setstring mapqueue priority queue priority queue常見的用途 stack pair vector vi 100 vectorvi 區別可以理解成乙個是乙個一維長度已經固定,乙個是可變的 1 通過下邊 2 通過迭代器 vector iterator it ...

標準模板庫( ) 介紹標準模板庫

標準模板庫就是類與函式模板的大集合。stl共有6種元件 容器,容器介面卡,迭代器,演算法,函式物件和函式介面卡。1 容器 容器是用來儲存和組織其他物件的物件。stl容器類的模板在標準標頭檔案中定義。1 序列容器是上面圖中的前三類 容器的操作 2 deque容器 非常類似vector,且支援相同的操作...

C 標準模板庫(STL介紹) string

string str1 ab str2 xy string str str1 str2 比較規則是字典序 方法一 string str abcxyz str2 opq str.insert 3 str2 輸出 abcopqxyz 方法二 string str abcxyz str2 opq str....