免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7326 | 回复: 6
打印 上一主题 下一主题

有这种数据结构吗?能记录key插入顺序的map。 [复制链接]

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-05 22:07 |只看该作者 |倒序浏览
如题,我想让map返回所有key时保持它们插入的顺序。

论坛徽章:
0
2 [报告]
发表于 2012-05-06 09:25 |只看该作者
据我的了解,标准库的map不支持这个功能;得结合自己的应用进行开发。

比如,开发一个类,数据成员有map,及deque,前者用于记录key->value,后者用于记录key的插入顺序。
或者,map的value带上一个时间戳,它的大小关系直接反映出key的插入顺序。
至于选择哪种,根据应用来。经常要获取key的插入顺序的,用前者;偶尔的,用后者。

------------------------------------
欢迎光临我的博客:www.danoking.com [DNK的生涯|IT人的故事]

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2012-05-06 10:26 |只看该作者

  1. namespace std{
  2.     mapEx<TK,TV>:map<TK,TV>{
  3.     private:
  4.           std::vector<TK>; // Remember the insert sequence here
  5.     public:
  6.           insert(...);
  7.           remove(...);
  8.    };
  9. }
复制代码

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
4 [报告]
发表于 2012-05-06 10:30 |只看该作者
我自己实现了,只是想知道有没有通用的数据结构有这种特性。看来是没有了,谢谢两位。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2012-05-06 13:22 |只看该作者
tempname2 发表于 2012-05-05 22:07
如题,我想让map返回所有key时保持它们插入的顺序。


题目不太准确:
1. map是指STL那个吧?
2. 顺序是指什么? begin/end?
3. 所有key —— [begin,end) 保持插入顺序? 那还不如用list……
4. 应该是所有等价的key保持插入顺序吧?
但map中等价的key是唯一的……  应该是multimap?


如果将题目改为:二叉搜索树中序遍历中、等价key区间中的元素是否能保持插入时的相对顺序。
答案是可以的。只要插入时稍微注意就行。

不妨设中序遍历得到的是升序。
因为中序遍历是左子树、根、右子树,插入x时,与当前节点n比较:
1. x < n 插入n的左子树 —— 那么中序遍历时x在n之前
2. x > n 插入n的右子树 —— 那么中序遍历时x在n之后,这两点保证升序
3. x = n 插入n的右子树 —— 那么中序遍历时等价的两节点x、n,后插入的x出现在先插入的n之后


而STL中的multimap,C++11增加了一句话,保证对等价的key会保持插入时的相对顺序 —— 也就是说:
1. C++03很有可能就没有这样的保证……
2. 但C++03的很多实现应该是有提供这样的保证的

保险的话,只能用类似map<K,vector<V> >这样的手段……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2012-05-06 13:28 |只看该作者
回复 2# wolf5729

翻了翻你的博客,关于CFuncAtDestruct,推荐你看看loki的scopeguard。

论坛徽章:
0
7 [报告]
发表于 2012-05-07 00:37 |只看该作者
回复 6# OwnWaterloo


    谢谢你的指点。



------------------------------------
欢迎光临我的博客:www.danoking.com [DNK的博客]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP