在前幾天的阿里面試過程中,問到了我標準模板庫的繼承體系。平時開發對vector,list, map,set ,stack等容器用的比較多,但是沒有深入研究過。經歷過面試,發現了很多需要完善和提高的地方。
但是有個問題哦,標準模板庫中得幾大元件沒有啥繼承關係,只是說有某些容器之間有適配關係。
所謂容器,就是存放資料的倉庫,定義了資料在記憶體中的組織方式,
主要:有序列式容器(線性資料結構)、關聯連式容器(非線性資料結構:樹結構)
序列容器,典型的容器vector,相對於c++內嵌的陣列,vector的優點是支援資料的動態擴充套件。
而空間的動態擴充套件,有空間配置器配置。它會為容器提供空間分配的策略,比如空間不夠時增長的幅度。
迭代器統一了容器的訪問操作,很好的東西。想到了迭代器模式
view source
print?
1
containercons;
2
for
(container::iterator iter = cons.begin();
3
iter != cons.end(); iter++)
4
看看《stl原始碼分析》中關於vector的定義
view source
print?
1
template
<
class
t,
class
alloc = alloc>
2
class
vector
3
這裡很明顯的是通過typedef定義將指標定義為vector的迭代器,提供統一訪問,但是本質上還是指標哈。
vc的vector的迭代器定義:是乙個類哈,有許多資料組成了迭代器的定義,其中有指標,有引用。
view source
print?
01
template
<
class
_myvec>
02
class
_vector_iterator
03
:
public
_vector_const_iterator<_myvec>
04
pointer定義,就是某個資料型別的指標
view source
print?
1
typedef
value_type _farq *pointer;
再看下hashtable中的迭代器的定義:
view source
print?
1
......
2
struct
_hashtable_iterator
3
在hashtable迭代器中,有兩個指標,一是當前節點的指標,二是buckets vector的指標。
綜上所述,所謂迭代器,就是對指標以及其他輔助資訊的乙個封裝。對資料的訪問一定是通過位址訪問,位址是必須的,所以位址是迭代器中不可缺少的資訊。
在迭代器的使用中,常常遇到的乙個問題就是,在進行資料的插入刪除時的失效問題!其實就是指標的問題哈
空間配置器用於遮蔽容器關於記憶體管理的細節。比如容器記憶體的申請釋放,當記憶體不夠時採用怎樣的一種策略。在我們平常的使用中,
view source
print?
1
vectorstus;
並沒有制定容器的空間配置方案,於是採用預設的配置方案,其實我們是可以自己編寫空間配置方案,並將該方案實施於某個容器。(customalloc是自定義的命名空間,並實現了空間配置方案allocator)
view source
print?
1
vector<
int
, customalloc::allocator<
int
>> datas;
可以在自定義的方案中進行記憶體管理。
提供了大量常用、通過的演算法,比如比較、查詢、資料移動、複製、交換等等。
基礎演算法:min, max, swap
排序:sort
替換:replace
查詢:find
此處不一一枚舉
函式物件,簡單的理解就是將乙個函式封裝為物件,但是它的作用是為容器的操作提供依據。我進行比較大小,根據什麼比,函式物件提供,查詢,匹配的規則是什麼,函式物件提供。
例如:
1. 對vector容器進行排序,排序的標準是?
2. 對容器中得資料進行查詢,查詢的標準是?
通過函式物件,可以靈活的編寫操作依據,並注入到操作函式中。
為sort函式編寫compare()
為find_if編寫query()
此處寫了個例項,說明一下用法:
業務物件定義:
view source
print?
01
class
student
02
12
13
student(
const
student &stu)
14
17
18
student& operator=(
const
student &stu)
19
24
};
函式物件定義,說明物件之間比較的依據,此處依據是年齡
view source
print?
01
struct
compare :
public
std::binary_function
02
10
};
測試程式:
view source
print?
01
int
_tmain(
int
argc, _tchar* argv)
02
15
16
for
(vector::iterator iter = stus.begin(); iter != stus.end(); iter++)
17
cout"--"
<< iter->age<
18
cout<<
"-----------------------------"
<
19
sort(stus.begin(), stus.end(), compare());
20
for
(vector::iterator iter = stus.begin(); iter != stus.end(); iter++)
21
cout"--"
<< iter->age<
22
23
getchar
();
24
return
0;
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....