STL庫 set和map的使用和原理

2021-07-27 00:23:31 字數 3141 閱讀 3662

set和map是c++標準庫中的關聯容器,它們中的所有元素都會根據元素的鍵值(key)自動被排序,又由於紅黑樹(rb-tree)是一種平衡二叉搜尋樹,自動排序效果非常好,所以標準的stl中的set和map容器都是以紅黑樹(rb-tree)為底層機制,又由於map和set所開放的各種操作介面,rb-tree也提供了,所以它們幾乎所有的操作行為,都只是轉調rb-tree的操作行為。

set介紹:set是儲存已排序的無重複的元素,它有過濾重複功能,它元素的鍵值(key)就是實值(value),實值就是鍵值,所以set的迭代器不能改變其元素值,否則會嚴重破壞其set有序的組織,所以其迭代器被定義為底層rb-tree的const_iterator,杜絕寫入操作。

set原始碼:

template< class key,

class compare = less, //預設情況下採用遞增排序

class alloc = alloc>

class set;

set幾個重要操作行為介面:

首先要了解介面各元素型別:

其中pair是乙個結構體,定義如下:

template struct pair

pair(const t1& a,const t2& b):first(a),second(b) {}

}

在上插入返回值pair則代表插入時第乙個返回迭代器即插入位置,第二個插入成功則返回true,插入失敗返回false.

使用練習:

#include #include #include using namespace std;

void testset()

int arr=;

s.insert(arr,arr+7);

set::iterator it;

for (it=s.begin(); it!=s.end(); it++)

cout << " " << *it;

cout << endl;

//erase與find使用

s.erase(0);

s.erase(14);

it=s.find(7);

s.erase(it);

s.erase(s.find(8));

it=s.begin();

++it;

s.erase(it,s.find(4));

for (it=s.begin(); it!=s.end(); it++)

cout << " " << *it;

cout << endl;

}int main()

執行結果:

map介紹:map

的所有元素為pair,同時擁有實值(value)和鍵值(key),pair第一元素為鍵值,第二元素為實值,它不允許兩個元素擁有相同的鍵值,其中可以通過map迭代器修改其元素實值(value),但不能修改鍵值(key),會破壞map有序組織。

map原始碼:其中key為鍵值(key)型別,t為實值(value)型別

template , //預設採用遞增排序

class alloc = alloc>

class map;

map幾個重要操作行為介面:

介面各元素型別:

operator實現原理:返回實值(value)的引用

使用練習:

void testmap()

{ mapm;

//inset使用

m.insert(pair('a',10));

m.insert(pair('b',10));

m.insert(pair('d',20));

m.insert(pair('c',30));

pair::iterator,bool> ret=m.insert(pair('d',40));

if(ret.second==false)

{ cout<

cout<::iterator it="m.begin();

++it;

m.insert(it,pair('f',40));

m.insert(it,pair('e',10));

for ( it=m.begin() ; it != m.end(); it++ )

cout << (*it).first << " :: endl>

//erase使用

it=m.begin();

++it;

++it;

++it;

m.erase (it);

m.erase('e');

it=m.begin();

map::iterator it2=m.end();

--it2;

m.erase ( it, it2 );

cout<

執行結果:

map和set的使用和原理

我們學習過順序容器如vecor,list等,它們中的元素是按照在容器中的位置來順序儲存和訪問的。而接下來要學習的關聯容器則有根本的不同,它們中的元素是按關鍵字來儲存和訪問的。在 c primer 中列舉了標準庫中的8個關聯容器,如下 關聯容器支援高效的關鍵字查詢和訪問,我們在這裡介紹兩個主要的關聯容...

Map和Set簡單使用

map 和set的底層就是紅黑樹,map是k,v模型,而set是k模型。以上就是map的內部實現的成員函式,構造,插入刪除,等。map作為k,v模型,可以有很多用途,比如實現乙個字典。map實現乙個字典 include using namespace std include include int ...

Map和Set簡單使用

map 和set的底層就是紅黑樹,map是k,v模型,而set是k模型。以上就是map的內部實現的成員函式,構造,插入刪除,等。map作為k,v模型,可以有很多用途,比如實現乙個字典。map實現乙個字典 include using namespace std include include int ...