
一、利用下标法:
m1[str] = val
先查找有没有str这个元素,如有,不作任何 *** 作,没有的话,添加str并给str关联的对象赋值也可以只写m1[str]
二、利用函数
m1.insert(e),e为pair型,即,val_type,如果,e.fitst不在map中,刚添加e
m1.insert(beg, end) beg, end, 为元素迭代器,必须是val_tyle型
m1.insert(iter, e) 如果e.first不在m中,创建新元素,并以iter为起点找新元素的位置.
楼上的比我快一步,不好意思!
Go map实现原理
深入Go的Map使用和实现原理
go 中的 map 也是 hashmap,由哈和(bucket)数组组成,每个 bucket 可以存放若干元素(默认8个),当超过 8 个元素后,hmap会使用extra中的overflow指向新的 bucket 来拓展该bucket;
bucket 数组 tophash 数组 data字节数组 overflow 链表
哈希冲突后的数据结构:
overflow 表示溢出的意思
负载因子用于表示哈希冲突的情况 = 键数量 / bucket 的数量
哈希因子需要控制在合适的大小,超过阙值后需要 rehash
* 哈希因子过小,说明空间利用率低
* 哈希因子过大,说明冲突严重,存取效率低
每个 hash 表的实现对负载因子的容忍程度不同,redis 中负载因子为 1 时就会触发 rehash,因为 redis 的每个 bucket 只能存储一个键值对。而 go 的能存储 8 个,负载因子为 6.5;
4.1 扩容的前提条件
为保证访问效率,当新元素要添加时,都会检查是否需要扩容,扩容实际是空间换时间;
4.2 增量扩容
负载因子超过阙值后,新建一个 buckets,长度为原来的2倍,旧 buckets 的数量逐渐搬迁至新的 buckets 中。
如果数据量较大,采取渐进式hash, 每次访问 map 都会触发一次搬迁 ,每次搬迁2个键值对,搬迁完成后将会删除 oldbuckets;
4.3 缩容
通过不断地删除,键值对集中在一小部分地 bucket 中,overflow 中大部分是空的,经过重新组织后 bucket 的数量会减少,提高访问效率;
用的是c++ map的insert方法。
函数定义:
single element (1) 插入单个元素 队尾插入
pair<iterator,bool>insert (const value_type&val)
with hint (2) 插入单个元素 在position的位置插入
iterator insert (iterator position, const value_type&val)
range (3) 插入一串元素 一般用的是另一个map中的,从开始到结束
template <class InputIterator> void insert (InputIterator first, InputIterator last)
示例:
// map::insert (C++98)#include <iostream>
#include <map>
int main ()
{
std::map<char,int> mymap
// first insert function version (single parameter):第1种
mymap.insert ( std::pair<char,int>('a',100) )
mymap.insert ( std::pair<char,int>('z',200) )
std::pair<std::map<char,int>::iterator,bool> ret
ret = mymap.insert ( std::pair<char,int>('z',500) )
if (ret.second==false) {
std::cout << "element 'z' already existed"
std::cout << " with a value of " << ret.first->second << '\n'
}
// second insert function version (with hint position):第2种
std::map<char,int>::iterator it = mymap.begin()
mymap.insert (it, std::pair<char,int>('b',300)) // max efficiency inserting
mymap.insert (it, std::pair<char,int>('c',400)) // no max efficiency inserting
// third insert function version (range insertion):第3种
std::map<char,int> anothermap
anothermap.insert(mymap.begin(),mymap.find('c'))
// showing contents:
std::cout << "mymap contains:\n"
for (it=mymap.begin() it!=mymap.end() ++it)
std::cout << it->first << " => " << it->second << '\n'
std::cout << "anothermap contains:\n"
for (it=anothermap.begin() it!=anothermap.end() ++it)
std::cout << it->first << " => " << it->second << '\n'
return 0
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)