前兩天剛開的學,哎、、、我原來已經大三了,花了兩、三天的時間來平復一下那顆躁動的心啊,畢竟空想者真滴很空虛滴。咱
…..進入主題。
上次談了談順序容器,這次說說關聯容器,it界的大師們對事物的命名總是那麼滴簡潔、通俗,不會多一字,亦不少一字。順序容器是按位置來訪問和儲存元素的,很好理解,那關聯二字呢?粗糙地理解為一物系一物,不錯滴!就是這麼簡單。在資料結構中我們學過了雜湊表,回想一下,它就是通過將鍵與值關聯在一起,提高了訪問和查詢的效率,關聯容器呢?亦是如此,也是通過鍵來儲存和讀取元素。
關聯容器最基本的有兩種:
1、 map
2、 set
當然還有:multimap 支援同乙個鍵多次出現的map型別
multiset 支援同乙個鍵多次出現的set型別
兩者的區別在於map容器是鍵-值的集合,而set容器只是鍵的集合,也就是說set容器是沒有關聯值的。關聯容器還是包含順序大部分操作,除了一些牽涉到鍵的操作,比如說不提供front、push_front.、pop_front等。因為關聯容器的插入和刪除與位置沒有關係,只和鍵有關。所以在區間插入時,同樣是insert函式,但是關聯容器比順序容器的函式少乙個位置引數:
順序容器:
void container::insert(iterator position, inputiterator begin, inputiterator end);
關聯容器:void container::insert(inputiterator begin, inputiterator end);
還有像刪除函式中,它們的返回值也不同,乙個是迭代器型別,乙個是void型等等。追根接地還是因為它們對元素自身的屬性不同造成的。
map容器其實在曾今做acm題的時候用到過,記得那是做乙個字典排序的問題,開始百思不得其解(因為是大一,還沒接觸過勒),但是經過乙個學長指點,直接用map做,只用了幾行**而已,而且還高效,當然當時沒有容器的概念,呵呵、、、map就是乙個集合鍵-值對的陣列,所以當然可以通過陣列下標訪問這些元素,當然這樣的效率極低,而且也違背了關聯容器的初衷。所以它的訪問和儲存都與鍵值有關,這裡也不用多說那些插入刪除的方式,當時看關聯容器的時候,我還在想,要怎樣遍歷關聯容器呢?因為我們不可能調取所有的關鍵字來訪問,而且關聯容器本來就類似個雜湊表,裡面的元素師雜湊的。最終還是得用到迭代器,當然這時的迭代器並不是簡單地從容器頭乙個乙個的掃瞄過去,而是關聯容器元素是按關鍵字的大小排列的,所以迭代器遍歷的時候可以跳過那些空的地方(當然這個空並不是真正意義上的啥也沒有,只是該位置的狀態為空)。
set容器開始提了一下,它與map不同,它只儲存鍵值的集合,定義於標頭檔案中,並支援大部分map容器的操作,與map一樣,set容器儲存的鍵也必須是唯一的,而且不能修改,因為是鍵的型別是const的嘛。然後談談它們各自適用的情況,map型別適合需要了解鍵與值對應的情況,也就是要通過鍵提取值資訊的情況。而set型別適合於只需判斷某值是否存在的情況,不需查詢值的詳細資訊。
當然上面的所有都是談談關聯容器的表面,沒有去內部**其實現機制——rbtree。這個還是放在後面認真學stl的時候再去仔細瞧瞧。書中有個文字查詢程式,我試著做做吧,等我滴好訊息吧、、、呵呵
一心向學
MyC 之順序容器
myc 之順序容器 上篇文章講述的是泛型程式設計,在泛型程式設計裡面最能耳熟就是容器了,容器是什麼?就是類模板,模板上次已經說過了,這裡就不多說。容器裡面又分好幾類,c primer 裡面介紹的是兩類 順序容器和關聯性容器。當然容器肯定不止這兩類,還有什麼非標準順序容器之類的什麼 這個暫且不說。這次...
STL之關聯容器
1.set單重集合 不允許key重複 set作為乙個容器,也是用來儲存同一資料型別的資料型別,並且能從乙個資料集合中取出資料 c stl中標準關聯容器set,multiset,map,multimap內部採用的就是一種非常高效的平衡檢索二叉樹 紅黑樹 include using namespace ...
STL之關聯容器
關聯容器包含map set multimap multiset。關聯容器的特點是明顯的,相對於順序容器,有如下特點 1 其內部是採用非線性的二叉樹結構,具體的說是紅黑樹的結構原理實現的。2 set和map保證了元素的唯一性,multiset和multimap擴充套件了這一屬性,可以允許元素不唯一。3...