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