C++ 按相反顺序搜索多重映射
有没有一种方法可以按对数复杂度的相反顺序搜索多重映射(C/C++STL)?您可以使用C++ 按相反顺序搜索多重映射,c++,algorithm,stl,complexity-theory,multimap,C++,Algorithm,Stl,Complexity Theory,Multimap,有没有一种方法可以按对数复杂度的相反顺序搜索多重映射(C/C++STL)?您可以使用上限和下限作为常规,但可以反转迭代代码 找到的最后一个匹配元素为: 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->
上限
和下限
作为常规,但可以反转迭代代码
找到的最后一个匹配元素为:
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;
}
}
您可以正常使用
上限
和下限
,但要反转迭代代码
找到的最后一个匹配元素为:
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;
}
}
我很确定,因为多重映射基本上是一种树表示,唯一的搜索机制是遍历树,没有“向前”和“向后” 您可以找到第一个匹配元素的
下界
,一个超过最后一个匹配元素的上界
,或者与相等范围
的键匹配的完整范围。编辑:所有这些方法都以对数复杂度运行
你能更详细地介绍一下你需要什么吗?我很确定,因为多重映射基本上是一种树表示,唯一的搜索机制是遍历树,没有“向前”和“向后” 您可以找到第一个匹配元素的
下界
,一个超过最后一个匹配元素的上界
,或者与相等范围
的键匹配的完整范围。编辑:所有这些方法都以对数复杂度运行
您能详细介绍一下您需要什么吗?我猜您正在寻找一种搜索算法,以在
std::multimap
中找到一个键
O(logn)
在n
键的multimap
中找到任何键O(1)
找到由multimap持有的最大密钥
没有这种东西是内置的。大多数(所有?)多重映射都实现为平衡树,对
multimap::find()
的调用首先测试映射的中间部分,因为这是树的根所在。如果您实现了一个嘈杂的操作符,您可以自己看到,我猜您正在寻找一种搜索算法来定位std::multimap
中的一个键
保证O(logn)
在n
键的multimap
中找到任何键
保证O(1)
找到由multimap持有的最大密钥
没有这种东西是内置的。大多数(所有?)多重映射都实现为平衡树,对multimap::find()
的调用首先测试映射的中间部分,因为这是树的根所在。如果您实现了一个嘈杂的操作符,您可以自己看到,您的问题可以有两种解释。如果您的意思是插入了一组具有相同键的元素,并且希望找到具有该键的最后一个插入元素,那么您可以尝试equal_range(key)
,它返回一对迭代器(一个指向第一个元素,另一个指向最后一个元素)。但是,我不知道multimap
是否能保证具有相同键的元素的存储顺序
或者,如果您的意思是希望以相反的顺序遍历multimap
,则可以使用rbegin()
和rend()
获得反向迭代器。您的问题可以用两种方式解释。如果您的意思是插入了一组具有相同键的元素,并且希望找到具有该键的最后一个插入元素,那么您可以尝试equal_range(key)
,它返回一对迭代器(一个指向第一个元素,另一个指向最后一个元素)。但是,我不知道multimap
是否能保证具有相同键的元素的存储顺序
或者,如果您的意思是希望以相反的顺序遍历multimap
,则可以使用rbegin()
和rend()
来获取反向迭代器。C++标准模板库如果您愿意……那么“以相反的顺序搜索”到底是什么意思Cubbi的观点是,在C.@ Ni Ki-YoiuCiCh中没有STL:通过反向搜索,我的意思是,在搜索中遇到的第一个元素是最后插入的元素.C++标准模板库,如果您喜欢……“搜索反向顺序”究竟是什么意思?Cubbi的观点是C中没有STL。@Niki Yoshiuchi:按相反的顺序搜索,我的意思是,我在搜索中遇到的第一个元素是最后插入的元素。我在寻找一个等价的multimap::find(),它返回最后插入的元素。我只需要满足条件的最后一个元素。当我使用equal_range时,与multimap::find()?@Simon.Jacobi相比,是否存在开销:如果您要按照满足条件的插入顺序查找最后一个元素,vector
/deque
可能是更好的选择。映射没有“插入顺序”的概念,我正在寻找一个等价的multimap::find()函数,它返回最后插入的元素。我只需要满足条件的最后一个元素。当我使用equal_range时,与multimap::find()?@Simon.Jacobi相比,是否存在开销:如果您要按照满足条件的插入顺序查找最后一个元素,vector
/deque
可能是更好的选择。地图没有“插入顺序”的概念。