c++ stl map
来源:互联网 发布:淘宝能卖视频吗 编辑:程序博客网 时间:2024/06/16 19:16
1.map
map的特性是,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素被视为键值,第二个被视为实值。map不允许两个元素拥有相同的键值。
template<class T1,class T2>struct pair{ typedef T1 first_type; typedef T2 second_type; T1 first; //public T2 second; //public pair():first(T1()),second(T2()){} pair(const T1& a,const T2& b):first(a),second(b){}};
通过map的迭代器修正元素的键值是不行的,因为map元素的键值关系到map元素的排列规则。修改元素的实值是可以的,因为map元素的实值并不影响元素的排列规则。因此,map iterators既不是一种constant iterators,也不是一种mutable iterators。
map拥有和list相同的某些性质:当客户端对它进行元素新增操作(insert)或者删除操作(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效。
由于RB-tree是一种平衡二叉树搜索树,自动排序的效果很不错,所以标准的STL map即以RB-tree为底层机制。又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map操作行为,都只是转调用RB-tree的操作行为而已。
2.实例
#include <iostream>#include <string>#include <map>typedef std::pair<int,std::string> ISPAIR;typedef std::map<int,std::string> ISMAP;int main(){ ///1.[]操作符重载方式插入数据 std::cout<<"---- part 1 ----"<<std::endl; ISMAP mymap; mymap[1] = "abc"; mymap[3] = "bcd"; mymap[7] = "def"; ISMAP::iterator myiter = mymap.begin(); for(;myiter != mymap.end();++myiter) { std::cout<<myiter->first<<std::endl; std::cout<<myiter->second<<std::endl; } ///2.insert方式插入数据 std::cout<<"---- part 2 ----"<<std::endl; mymap.insert(ISPAIR(5,"cde")); myiter = mymap.begin(); for(;myiter != mymap.end();++myiter) { std::cout<<myiter->first<<std::endl; std::cout<<myiter->second<<std::endl; } ///3.find方式查询数据并修改当前元素value std::cout<<"---- part 3 ----"<<std::endl; myiter = mymap.find(3); if(myiter != mymap.end()) { std::cout<<myiter->first<<std::endl; std::cout<<myiter->second<<std::endl; myiter->second = "modify1"; } ///4.[]操作符重载方式查询数据并修改当前元素value std::cout<<"---- part 4 ----"<<std::endl; mymap[5] = "modify2"; ///5.键值存在的元素无法insert插入 std::cout<<"---- part 5 ----"<<std::endl; mymap.insert(ISPAIR(7,"modify3")); myiter = mymap.begin(); for(;myiter != mymap.end();++myiter) { std::cout<<myiter->first<<std::endl; std::cout<<myiter->second<<std::endl; } return 0;}
---- part 1 ----1abc3bcd7def---- part 2 ----1abc3bcd5cde7def---- part 3 ----3bcd---- part 4 -------- part 5 ----1abc3modify15modify27def
3.解析
1.面对关联式容器,应该使用其所提供的find函数来搜寻元素,会比使用STL算法find()更有效率。因为STL算法find()只是循规搜索。
2.insert函数
pair<iterator,bool> insert(const value_type& x){ return t.insert_unique(x); }
此式将工作直接转给底层机制RB-tree的insert_unique()去执行。成功,iterator指向被插入的那个元素;失败,指向插入失败点(键值重复)的旧元素。
3.operator[]函数
typedef Key key_type;typedef pair<const Key,T> value_type;T& operator[](const key_type& k){ return (*((insert(value_type(k,T()))).first)).second ;}
(1)value_type(k,T())
//产生一个暂时对象
(2)insert(value_type(k,T()))
//将该元素插入到map里
(3)insert(value_type(k,T())).first
//insert(value_type(k,T()))
返回一个pair<iterator,bool>
其第一个元素是个迭代器,指向插入妥当的新元素。
(4)*(insert(value_type(k,T())).first)
//提领该迭代器
(5)*(insert(value_type(k,T())).first).second
//获取一个map元素,是一个由键值和实值组成的pair,取其第二元素。
(6)实值以by reference方式传递。
4.参考文献
本文内容摘录于《STL源码剖析》
- [c++]stl map
- C++STL:map概述
- C++stl map学习
- C++STL之map
- 【C++】STL--MAP
- [C++]STL之map
- C++STL 之map
- C++STL之map
- [C++] STL里面的map
- 1.c++-stl map详解
- C++STL之map学习
- Codeforces 4C (STL map)
- C++STL (vector,list,map)
- C++STL之 map详解
- [C++]HashMap实现STL map
- C++STL之map学习
- c++stl中的map/multimap
- [C++] STL Map的简单用法
- 尚硅谷java——网络编程
- Python学习笔记(相比静态语言的一些不同之处)
- WPF/WCF开发教程
- PAT乙级 1020. 月饼 (25)
- ios 手动忽略编译警告
- c++ stl map
- UVA1603SquareDestroyer
- 判断三相电动机线圈好坏的方法
- [BZOJ3378]一套NOIP膜你题:膜拜azui
- Tengine用户访问配置
- 08. Servlet 表单处理
- 在 SharePoint Server 2016 中定义托管路径
- jdbc报错Loading class `com.mysql.jdbc.Driver'. This is deprecated
- js函数(下)