STL学习记录(九)Maps、Multimaps
2015-10-06 00:00
309 查看
STL关联容器Map、Multimap
Map、Multimap容器简介
map、multimap中的元素是以一对key/value值的形式存在。容器中元素的顺序与根据自动排序准则对key值进行排序后的顺序一致。这两个容器的不同之处在于:前者key值必须唯一,不需要出现相同key值;后者则允许相同key值。这表明key值得类型必须是可以进行比较的。在使用这两个容器的时候都必须包含头文件< map >。它们的定义如下:namespace std{ template <typename Key, typename T, typename Compare = less<Key>, typename Allocator = allocator<pair<const Key,T> > > class map; template <typename Key, typename T, typename Compare = less<Key>, typename Allocator = allocator<pair<const Key,T> > > class multimap; }
上面定义中第一个参数是容器中元素的key值,第二个参数是与key相关联的value值。整个元素的类型为 pair < const Key,T >。第三个可选的参数定义了排序的准则。与set一样排序准则是“strict weak ordering”。这个准则说明如下:
//下面两个参数为key值 T key1 = a; T key2 = a; bool tag; if(key1>=key2) tag = true; else tag = false; //tag不是我们平时见到的那样为true,而是false。因为”strict weak ordering”准则中只有大小关系,不存在相等关系 //若两者相等返回值也是false
常用类:
操作 | 说明 |
---|---|
c.size( ) | 返回c里面元素的个数 |
c.empty( ) | 判断c是否为空 |
c.max_size( ) | 返回c的最大的容量 |
c.key_comp( ) | 返回比较策略 |
c.value_comp( ) | 返回元素值得比较策略(与上面操作相同) |
c1.swap(c2) | 交换c1、c2中的数据 |
swap(c1,c2) | 交换c1、c2中的数据 |
操作 | 说明 |
---|---|
c.begin( ) | 返回c的第一个元素的双向迭代器 |
c.end( ) | 返回c的最后一个元素之后位置的双向迭代器 |
c.cbegin( ) | 返回c的第一个元素的const型双向迭代器 |
c.cend( ) | 返回c的最后一个元素之后位置的const型双向迭代器 |
c.rbegin( ) | 返回c逆序的第的第一个元素的反向迭代器 |
c.rend( ) | 返回c逆序的最后一个元素的反向迭代器 |
c.crbegin( ) | 返回c逆序的第一个元素的const型反向迭代器 |
c.crend( ) | 返回c逆序的最后一个元素的const型反向迭代器 |
操作 | 说明 |
---|---|
c.count(val) | 返回元素值为val的元素个数 |
c.find(val) | 返回第一个元素值为val的元素的位置 |
c.lower_bound(val) | 返回第一个val插入c中时的可能位置,也就是第一个>=val元素的位置 |
c.upper_bound(val) | 返回最后一个val插入c中时的可能位置,也就是第一个>val元素的位置 |
c.equal_range(val) | 返回所有元素值为val的元素的位置范围 |
操作 | 说明 |
---|---|
c[key] | (如果关键值为key的项不存则插入)返回关键值为key的元素的值的引用(非const类型map) |
c.at(key) | 返回关键值为key的元素的值的引用 |
操作 | 说明 |
---|---|
c.clear( ) | 删除c中的所有元素 |
c.erase(val) | 删除元素值为val的所有元素,并返回删除的个数 |
c.erase(pos) | 删除位于pos的元素,并返回下一个元素的位置 |
c.erase(beg,end) | 删除位于[beg,end)之间的元素,并返回下一个元素的位置 |
c.emplace(args…) | 将用参数args…初始化的元素插入到c中并返回该元素的位置c++11 |
c.emplace_hint(pos,args…) | 将参数args…初始化的元素插入到c中并返回该元素的位置(pos指明了从哪里开始搜索该位置) |
c.insert(pos,vaL) | 在pos之前插入vaL的拷贝并返回该元素的位置(pos指明了从哪里开始搜索该位置) |
c,insert(vaL) | 插入vaL的一个拷贝,并返回新插入元素的位置 |
c.insert(beg,end) | 将[beg,end)之间的元素插入到c中不返回任何东西) |
c.insert({*x1,x2,…}* | 将列表{*x1,x2,…}*中所有元素的拷贝插入到cz中(不返回任何东西) |
在支持c++11标准的环境中,最方便的插入操作是使用初始化列表
std::map<std::string,float> coll; ... coll.insert({"YourFirst",13.0});
使用value_type进行插入操作。
为了避免隐式类型转换,我们需要使用value_type明确的定义我们插入的元素。
std::map<std::string ,float> coll; ... coll.insert(std::map<std::string,float>::value_type("YourFirst",13.0));
使用pair<>进行插入操作
在使用该操作的时候,因为key值不可变也就是const类型对象,所以可能存在隐式类型转换。
std::map<std::string ,float> coll; ... //隐式类型转换 coll.insert(std::pair<std::string,float>("YourFirst",13.0)); //不包含隐式类型转换 coll.insert(std::pair<const std::string,float>("YourFirst",13.0));
使用make_pair( )进行插入操作
这是在不支持c++11标准环境中最方便的插入操作
std::map<std::string ,float> coll; ... coll.insert(std::make_pair("YourFirst",13.0));
另外,map的insert( )操作与set的类似,操作返回类型包含两个参数,第一个为位置,第二个标识是否插入成功。一个实例:
std::map<std::string ,float> coll; ... if(coll.insert(std::make_pair("YourFirst",13.0).second) std::cout<<" OK ,there is no this element before!"<<std::endl; else std::cout<<" fail , this element already exists!"<<std::endl;
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息