2013-03-21 361 views
0

在我的应用程序中,我有一个CString值的CMap。在Map中添加元素之后,如果我在其他位置检索元素,则不会按照插入顺序获取元素。假设我检索第三个元素,则获得第五个元素。这是CMap的行为吗?为什么会发生?为什么从CMap中检索元素没有排序

+0

这是MFC吗?你能提供一些代码吗? – Nick 2013-03-21 08:39:37

+0

我对CMap一无所知,但这就是地图通常的工作方式。它们基于散列或基于订单,两者都不保留广告订单。 – Thilo 2013-03-21 08:39:43

+0

@Nick ya我正在谈论MFC集合类。 – CodeRider 2013-03-21 08:41:07

回答

6

你问“为什么”,所以这里有云:

一个地图提供了一种有效的方式通过键来检索值。它通过使用一个比列表或数组更快的巧妙数据结构来实现这一点(在你知道某个元素是否存在或不存在的情况下,你必须搜索整个列表)。有一些权衡,如增加的内存使用率,以及无法做其他事情(例如知道事物被插入的顺序)。

有实现这个

  • 一个HashMap,它通过散列值把钥匙进入水桶两种常用的方法。
  • 树形图,其中安排键为二叉树,根据它们的排序方式

可以遍历地图,但它会根据它们是如何存储在内部,无论是按键的顺序(树图)或完全不可预知(hashmap)。你的CMap似乎是一个hashmap。

无论哪种方式,插入顺序不会保留。如果你想要的话,你需要一个额外的数据结构(如列表)。

3

如何将文档读取到CMap? http://msdn.microsoft.com/ru-ru/library/s897094z%28v=vs.71%29.aspx

真的是无序的地图。你如何检索元素?由GetStartPositionGetNextAssoc?这里

http://msdn.microsoft.com/ru-ru/library/d82fyybt%28v=vs.71%29.aspx阅读备注备注

迭代序列是不可预测的;因此,“地图中的第一要素”没有特别的意义。

CMap的是,独特的键映射到值的字典集合类。将键值对(元素)插入到映射中后,可以使用键高效地检索或删除键对来访问它。您也可以迭代地图中的所有元素。

相关问题