STL库:set和map的使用和原理

来源:互联网 发布:bootstrap 可视化编程 编辑:程序博客网 时间:2024/06/06 09:05

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<Key>,  //缺省情况下采用递增排序  class Alloc = alloc>class set;

set几个重要操作行为接口:

首先要了解接口各元素类型:

其中pair是一个结构体,定义如下:

template <class T1,class T2>struct pair{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair():first(T1()),second(T2()) {}pair(const T1& a,const T2& b):first(a),second(b) {}}
在上插入返回值pair<iterator,bool>则代表插入时第一个返回迭代器即插入位置,第二个插入成功则返回true,插入失败返回false.



使用练习:

#include <iostream>#include <cstdlib>#include <set>using namespace std;void TestSet(){set<int> s;//insert使用for(size_t i=0;i<5;++i)s.insert(i);pair<set<int>::iterator,bool> ret=s.insert(3);if(ret.second==false){s.insert(ret.first,7);s.insert(ret.first,5);s.insert(ret.first,8);s.insert(ret.first,9);}int arr[]={10,1,9,11,6,13,14};s.insert(arr,arr+7);set<int>::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(){TestSet();system("pause");return 0;}
运行结果:



map介绍:map的所有元素为pair,同时拥有实值(value)和键值(key),pair第一元素为键值,第二元素为实值,它不允许两个元素拥有相同的键值,其中可以通过map迭代器修改其元素实值(value),但不能修改键值(key),会破坏map有序组织。

map源码:其中Key为键值(key)类型,T为实值(value)类型

template <class Key,class T,          class Compare = less<Key>, //缺省采用递增排序  class Alloc = alloc>class map;

map几个重要操作行为接口:

接口各元素类型:







operator[]实现原理:返回实值(value)的引用


使用练习:

void TestMap(){map<char,int> m;//inset使用m.insert(pair<char,int> ('a',10));m.insert(pair<char,int> ('b',10));m.insert(pair<char,int> ('d',20));m.insert(pair<char,int> ('c',30));pair<map<char,int>::iterator,bool> ret=m.insert(pair<char,int> ('d',40));if(ret.second==false){cout<<"Key:"<<ret.first->first<<" value:"<<ret.first->second;cout<<endl;}map<char,int>::iterator it=m.begin();++it;m.insert(it,pair<char,int>('f',40));m.insert(it,pair<char,int> ('e',10));for ( it=m.begin() ; it != m.end(); it++ )cout << (*it).first << " :: " << (*it).second << endl;//erase使用it=m.begin();++it;++it;++it;    m.erase (it); m.erase('e');it=m.begin();map<char,int>::iterator it2=m.end();--it2;    m.erase ( it, it2 ); cout<<endl<< "erase使用:";for ( it=m.begin() ; it != m.end(); it++ )cout <<(*it).first << " :: " << (*it).second << endl;//operator[]使用m['a']=10;m['b']=20;m['c']=30;m['d']=40;m['e']=50;m['f']=60;it2=m.find('f');m.erase(it2);cout<<endl;for ( it=m.begin() ; it != m.end(); it++ ){cout << (*it).first << " :: " << (*it).second << endl;}}


运行结果:

0 0
原创粉丝点击