是否存在以对数复杂度以相反顺序搜索多图(C / C ++ STL)的方法?
答案 0 :(得分:3)
您的问题可以通过两种方式解释。如果你的意思是你插入了一堆具有相同键的元素,并且想要找到带有该键的最后插入元素,那么你可以尝试equal_range(key)
,它返回一对迭代器(一个指向第一个元素,另一个是最后一个元素。但是我不知道multimap
是否对存储具有相同密钥的元素的顺序提供任何保证。
或者,如果您想要以相反的顺序遍历multimap
,则可以使用rbegin()
和rend()
来获取反向迭代器。
答案 1 :(得分:1)
我很确定,因为multimap
基本上是一个树表示,唯一的搜索机制是遍历树 - 没有“前进”和“后退”。
您可以找到第一个匹配的元素lower_bound
,一个匹配upper_bound
的最后一个匹配元素,或者匹配一个密钥equal_range
的完整范围。编辑:所有这些方法都以对数复杂度运行。
你能详细了解一下你需要什么吗?
答案 2 :(得分:0)
您可以正常使用upper_bound
和lower_bound
,但可以反转您的迭代代码。
找到最后一个匹配元素:
ub = m.upper_bound(1);
lb = m.lower_bound(1);
if (ub != lb) {
--ub;
return ub->second;
}
或只使用一次查找:
ub = m.upper_bound(1);
if (ub != m.begin()) {
--ub;
if (ub->first == 1) {
return ub->second;
}
}
答案 3 :(得分:0)
我猜您正在寻找一种搜索算法来查找std::multimap
中的密钥,
保证O(log n)
找到multimap
个n
个键中的任意键
保证O(1)
找到multimap
内置没有这样的东西。大多数(全部?)多重映射都是作为平衡树实现的,对multimap::find()
的调用首先测试映射的中间,因为那是树的根。如果您实施嘈杂的operator<
,您可以亲眼看看。
在调用rbegin()
之前,只需测试multimap::find()
指向的密钥是否满足您的要求?
如果通过“最后插入”实际上意味着最近添加到地图中的元素,那么根本无法找到它,multimap
和其他关联容器不会保留有关顺序的信息插入