C++中stl关于map函数

举报
资源描述
STL map常用操作简介1。目录map 简介map 的功能使用 map在 map 中插入元素查找并获取 map 中的元素从 map 中删除元素2。map 简介map 是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改 key。3。map 的功能自动建立 Key value 的对应。key 和 value 可以是任意你需要的类型。根据 key 值快速查找记录,查找的复杂度基本是Log(N),如果有1000 个记录,最多查找 10 次,1,000,000 个记录,最多查找 20 次。快速插入 Key-Value 记录。快速删除记录根据 Key 修改 value 记录。遍历所有记录。4。使用 map使用 map 得包含 map 类所在的头文件#include /注意,STL 头文件没有扩展名.hmap 对象是模板类,需要关键字和存储对象两个模板参数:std:map personnel;这样就定义了一个用int 作为索引,并拥有相关联的指向 string 的指针.为了使用方便,可以对模板类进行一下类型定义,typedef map UDT_MAP_INT_CSTRING;UDT_MAP_INT_CSTRING enumMap;5。在 map 中插入元素改变 map 中的条目非常简单,因为map 类已经对操作符进行了重载enumMap1=One;enumMap2=Two;.这样非常直观,但存在一个性能的问题。插入 2 时,先在 enumMap 中查找主键为 2 的项,没发现,然后将一个新的对象插入 enumMap,键是 2,值是一个空字符串,插入完成后,将字符串赋为Two;该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:enumMap.insert(map:value_type(2,Two)6。查找并获取 map 中的元素下标操作符给出了获得一个值的最简单方法:CString tmp=enumMap2;但是,只有当 map 中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。我们可以使用 Find()和 Count()方法来发现一个键是否存在。查找 map 中是否包含某个关键字条目用 find()方法,传入的参数是要查找的 key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是 iterator.int nFindKey=2;/要查找的 Key/定义一个条目变量(实际是指针)UDT_MAP_INT_CSTRING:iterator it=enumMap.find(nFindKey);if(it=enumMap.end()/没找到else/找到通过 map 对象的方法获取的 iterator 数据类型是一个 std:pair 对象,包括两个数据iterator-first 和 iterator-second 分别代表关键字和存储的数据7。从 map 中删除元素移除某个 map 中某个条目用 erase()该成员方法的定义如下iterator erase(iterator it);/通过一个条目对象删除iterator erase(iterator first,iterator last);/删除一个范围size_type erase(const Key&key);/通过关键字删除clear()就相当于 enumMap.erase(enumMap.begin(),enumMap.end();=hash_map 的用法和 map 是一样的,提供了insert,size,count 等操作,并且里面的元素也是以 pair 类型来存贮的。虽然对外部提供的函数和数据类型是一致的,但是其底层实现是完全不同的,map 底层的数据结构是 rb_tree而,hansh_map 却是哈希表来实现的。void main()/简单的一个列子,其使用方法和map 是一样的。hash_map hmap;/定义一个实例hmap.insert(pair(10,sfsfd);/插入一个 pair 对象,hmap.insert(hash_map:value_type(34,sddsf);/value_type就是 pair 类型的hmap23=23;hmap33=33;hmap-1=-1;hash_map:iterator it=hmap.begin();while(it!=hmap.end()/遍历coutfirsttsecondendl;it=hmap.find(23);/查找if(it!=hmap.end()PRINT(it);couthmap.size()endl;couthmap.count(58)endl;couthmap.empty()endl;hash_map:const_reverse_iterator cit=hmap.rend();PRINT(cit);从上面的列子可以看到,使用起来是没什么困难的,很方便。但是我们什么时候要用map,什么时候用 hash_map 呢?map 与 hash_map总 体来说,hash_map 查找速度会比 map 快,而且查找速度基本和数据量大小无关,属于常数级别;而 map 的查找速度是 log(n)级别。hash 还有 hash 函数的耗时。当有 100w 条记录的时候,map 也只需要 20 次的比较,200w 也只需要 21 次的比较!所以并不一定常数就比 log(n)小!hash_map 对空间的要求要比 map 高很多,所以是以空间换时间的方法,而且,hash_map如果 hash 函数和 hash 因子选择不好的话,也许不会达到你要的效果,所以至于用map,还是 hash_map,从3 个方面来权衡:查找速度,数据量,内存使用,还有一个就是你的经验!没有特别的标准另外可以通过重写 hash_compair仿函数,更改里面关于桶数量的定义,如果取值合适,也可以得到更优的性能。而且如果你的数据是自定义的类型,必须要重写这个仿函数。可以模仿原来的写法,所有的成员函数,成员变量一个不能少!
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 资格认证/考试 > 其它考试类文档


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号