c ++学习地图录入的顺序

时间:2013-10-25 13:52:15

标签: c++ map

如果我有一个带键的地图作为字符串。我怎么知道哪个字符串在地图中的哪个位置?例如,'cats'是第一个条目,'dogs'是第二个条目。我怎么知道狗是地图中的第二个条目?我应该浏览地图并搜索/检查订单还是有更简单的方法?

2 个答案:

答案 0 :(得分:3)

您可以find()元素,然后计算元素和地图distance之间的begin()。由于这是map,因此distance的复杂性将为O(n),其中包含地图中元素的数量。我怀疑你会看到很多性能改进而不是简单地循环地图和计数,但我宁愿不写这样的手写循环。

但这闻起来像XY Problem。为什么你需要一个元素在地图中的位置?

答案 1 :(得分:0)

你不能更好地做到这一点,这有两个原因:

a)std :: map里面有一棵树,所以最初树的叶子没有线性顺序,只有一个部分顺序(当然你可以比较两个键,但你不能这样做一般二叉树 - 这就是复杂化的原因。)

b)std :: map有双向迭代器,所以你不能有有效的迭代器算术。你可以这样做:

typedef map<string, int> MyMapT;
MyMapT data;
// ...
auto it = data.find("dog");
if (it == data.end()) {
  // don't have such a key
}
auto position = distance(data.begin(), data.end());

不幸的是,这不是最好的方法,因为距离函数在双向迭代器的O(n)时间内工作。再次,那是因为std :: map中的树结构。