以相反顺序搜索multimap
Searching a multimap in reverse order
是否存在以对数复杂度倒序搜索multimap (C/c++ STL)的方法?
你的问题可以有两种解释。如果你的意思是你已经插入了一堆具有相同键的元素,并且你想要找到带有该键的最后插入的元素,那么你可以尝试equal_range(key)
,它返回一对迭代器(一个指向第一个元素,另一个指向最后一个元素)。但是,我不知道multimap
是否对具有相同键的元素的存储顺序提供任何保证。
或者,如果您的意思是要按反向顺序遍历multimap
,您可以使用rbegin()
和rend()
来获得反向迭代器。
我很确定,因为multimap
基本上是一个树表示,唯一的搜索机制是遍历树-没有"向前"answers"向后"。
您可以找到与lower_bound
匹配的第一个元素,与upper_bound
匹配的最后一个元素,或者与equal_range
匹配的键的整个范围。编辑:所有这些方法都以对数复杂度运行。
我猜你正在寻找一种搜索算法来定位std::multimap
中的密钥,
-
保证
O(log n)
在n
密钥的multimap
中找到任何密钥 -
保证
O(1)
找到multimap
持有的最大的密钥
没有这种内置的东西。大多数(所有?)multimaps是作为平衡树实现的,对multimap::find()
的调用首先测试映射的中间,因为这是树的根所在的位置。如果你实现了一个嘈杂的operator<
,你可以自己看看。
在调用multimap::find()
之前简单地测试rbegin()
指向的键是否满足您的要求?
如果"最后插入"实际上是指最近添加到映射中的元素,那么根本没有办法找到它,multimap
和其他关联容器不保留有关插入顺序的信息。
您可以正常使用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;
}
}
- 链接库时的默认目录上的GCC或G 路径搜索顺序
- treap 中的轮换会违反它的堆排序或二叉搜索树顺序吗?
- 正在覆盖find_package的默认搜索顺序
- void类数组顺序和二进制搜索使用
- 按字母顺序对数组进行二分搜索和排序 C++.
- 通过索引快速搜索,并将插入顺序保持在C 中
- 二进制搜索树中按顺序遍历的复杂性(使用迭代器)
- 使用递归的顺序和预序遍历 - 二叉搜索树 C++
- 二进制搜索树顺序树显示
- std::ostringstream 运算符重载搜索顺序
- 顺序搜索查询
- 模板类C++符号范围搜索顺序不同
- 二进制搜索树,按顺序遍历,步骤3逻辑辅助
- 如何更改共享库的搜索顺序
- 命名空间搜索顺序
- 按顺序搜索boost::multi_index,按顺序获取下一个元素
- 如何使用双向搜索按字母顺序将随机字符串添加到数组中
- 使用无重复键的链表进行顺序搜索
- 理解C++顺序搜索的问题
- 以相反顺序搜索multimap