STL-map中的插入操作详解
来源:互联网 发布:富华网络 编辑:程序博客网 时间:2024/06/02 09:28
首先,我们可以如下使用map
:
//#include <map>map<string, int> simap;map[string("hou")] = 1;map[string("hou")] = 2;pair<string, int> value(string("ha"), 5);simap.insert(value);
先看insert
操作的源码:
pair<iterator,bool> insert(const value_type& x) { return t.insert_unique(x); }
其中,value_type
是一个pair
:
typedef pair<const Key, T> value_type;
因此上述的插入操作是向map
中插入一个pair
,它包含键和值。
[]
操作在map
中不包含键值的时候会插入键值,当包含键值时会替换相应的键值。这里要说的是insert_unique()
,它是map
底层使用的红黑树中的插入操作,源码如下:
template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>pair<typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator, bool>rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::insert_unique(const Value& v){ link_type y = header; link_type x = root(); bool comp = true; while (x != 0) { y = x; comp = key_compare(KeyOfValue()(v), key(x)); x = comp ? left(x) : right(x); } iterator j = iterator(y); if (comp) if (j == begin()) return pair<iterator,bool>(__insert(x, y, v), true); else --j; if (key_compare(key(j.node), KeyOfValue()(v)))//插入的值不与既有节点值重复 return pair<iterator,bool>(__insert(x, y, v), true); return pair<iterator,bool>(j, false);
从上述代码中我们可以看出,unique_insert()
只会在键不存在的时候才会插入成功(pair
的第二个值为true
)。
接下来分析[]
操作:
T& operator[](const key_type& k) { return (*((insert(value_type(k, T()))).first)).second;
k
是键,首先构造一个pair
:
value_type(k, T())
然后将这个pair
插入到红黑树中:
insert(value_type(k, T()))
插入代码在之前已经说明过。它是唯一性的插入,即如果已经存在键,那么不会插入,返回的pair
中的第二个元素是false
。
接下来取返回pair
的第一个元素,也就是个迭代器:
(insert(value_type(k, T()))).first
取迭代器指向节点的值:
*((insert(value_type(k, T()))).first))
该值实际上就是一个pair
,这跟上面说的pair
不一样。此处的pair
是一个键值对。
接下来取出它的值:
(*((insert(value_type(k, T()))).first)).second
最后,返回该值的引用即可。
这就是map
中的下标操作,这也就说明了文章刚开始时候代码能运行的原因。
谢谢
0 0
- STL-map中的插入操作详解
- STL中的map详解
- STL中的map用法详解
- STL中的map用法详解
- STL中的map用法详解
- STL中的map用法详解
- STL中的map用法详解
- STL中的map用法详解
- STL中的map简单详解
- STL中的map用法详解
- C++中STL中的map用法详解
- C++中STL中的map用法详解
- 基础备忘:STL中的map详解
- 详解STL中的map和hash_map区别
- 【C++】:C++ STL中的map 详解
- C++中的STL中map用法详解
- C++中的STL中map用法详解
- C++中的STL中map用法详解
- 转载:海量数据处理
- 系列文章-反病毒新视野
- 【安卓笔记】崩溃日志收集
- 简易SHA1函数(JavaScript实现)
- Union-Find 并查集
- STL-map中的插入操作详解
- 分割字符串
- 黑盒测试准备阶段
- Windows8下搭建Node.js开发环境教程
- windbg调试堆破坏
- tslib简单流程分析
- 关联规则的基本概念
- 460A - Vasya and Socks
- 允许多用户登陆Windows 2008远程桌面的方法(图文)