Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按相反顺序搜索多重映射_C++_Algorithm_Stl_Complexity Theory_Multimap - Fatal编程技术网

C++ 按相反顺序搜索多重映射

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->

有没有一种方法可以按对数复杂度的相反顺序搜索多重映射(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->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
    可能是更好的选择。地图没有“插入顺序”的概念。