C++STL——概述
阿新 • • 發佈:2017-08-03
tor http repl 數學 log 小問題 tle 內部 logs
一、叠代器的變化
和vector、list不同,set、map都是關聯式容器。set內部是基於紅黑樹實現的。插入和刪除操作效率較高,因為只需要修改相關指針而不用進行數據的移動。
在進行數據刪除操作後,叠代器會不會失效呢?刪除set的數據時,實際的操作是刪除紅黑樹中的一個節點,然後相關指針做相關調整。指向其他元素的叠代器還是指向原位置,並沒有改變,所以刪除一個節點後其他叠代器不會失效。list和map也是同樣的道理。然而刪除vector中的某個元素,vector中其他叠代器會失效,因為vector是基於數組的,刪除一個元素後,後面的元素會往前移動,所以指向後面元素的叠代器會失效。
二、叠代器的實現
叠代器是一個對象,vector的叠代器是封裝了數組下標;list、map、set的叠代器是封裝了元素節點的指針。
還有一點,從數學層面,set的一個集合,好比一個袋子裏面裝了好多個小球。但是紅黑樹是一種特殊的二叉搜索樹,set中的元素根據其值的大小在紅黑樹中有特定的位置,是不可移動的。所以,1是search操作效率會很高O(log n),2是set中元素的值不可改變。
【小問題】
set是基於紅黑樹實現的,那麽set的叠代器begin()、end()是指向哪裏的呢?
一個測試程序:
#include<iostream> #include<set> using namespace std; int main(){ set<int> myset; myset.insert(4); myset.insert(7); myset.insert(2); myset.insert(0); myset.insert(4); set<int>::iterator it; for(it = myset.begin(); it != myset.end(); it++){ cout<< *it; //輸出結果是:0247 } }
紅黑樹首先是二叉搜索樹,所以begin()叠代器指向紅黑樹的最左邊的節點,end()叠代器指向紅黑樹的最右邊的節點。另外這個小程序還說明了重復插入無效。
C++STL——概述