1. 程式人生 > >C++STL——概述

C++STL——概述

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——概述