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 ...