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
- STL库:set和map的使用和原理
- 【STL】map和set的使用
- map和set的使用和原理
- STL库的map和set的使用
- 高效的使用stl::map和std::set
- STL map 和 set的实现
- STL map和set的实现
- STL map 和 set的实现
- STL map 和 set的实现
- 【STL】map和set的基本用法
- STL之map和set的异同
- STL下的map和set
- 数据结构::STL库里map和set的用法简介
- 标准库STL中的map和set
- STL中list,vector,deque,map,set区别、联系和使用场景原理
- set和map中的STL
- STL map和set区别
- STL中的map和set
- Hbase表设计
- cvCamShift函数
- 利用minAreaRect求轮廓最小外接矩形
- OpenCV对图像的光照归一化处理
- API接口设计 注意问题
- STL库:set和map的使用和原理
- 我用python将结果写入txt文件出现的编码问题及其解决方法
- redis 安全
- unity animator 在 android 和ios上 不显示
- 离线安装hibernate插件
- 一步一步教你写BT种子嗅探器-原理篇
- 微信为什么不丢消息?
- 摄像机视图 react-native-camera 手机开发工具
- 编写Oracle包、过程或者函数,返回结果集,并且编写另一个过程或函数接收这个结果集并且输出;谁能提供思