【问题标题】:C++ map, find the first element that is less than keyC++ map,找到小于key的第一个元素
【发布时间】:2017-09-23 01:24:58
【问题描述】:

我目前正在寻找一种类似于 C++ 中映射的数据结构。

我正在寻找一个可以返回立即小于某个数字的第一个元素的函数。例如:

map<int,int> m;
m[1] ++;
m[2] ++;
m[4] ++;
m[5] ++;

find_first_element_less_than(3) ----> return 2; 
m.upper_bound(3) ---> return 4; 

我查看了lower_bound 函数。但是,它说它返回的第一个元素不少于 key。在这种情况下,lower_bound(3) 返回 4。这不是我想要的。

我想知道 C++ 中是否有任何数据结构可以为我做到这一点?


更新:

我可以auto it = m.lower_bound(3); if (it != m.begin()) it--;吗??

【问题讨论】:

  • 这还不清楚。你想找到键小于参数的 last 元素吗? (你想让函数返回值、键、迭代器还是什么?)

标签: c++ dictionary tree


【解决方案1】:

如果它不指向地图的开头,您可以找到下界,然后将迭代器减 1。

【讨论】:

    【解决方案2】:

    我认为您可以通过颠倒地图的顺序 (map&lt;int,int, std::greater&lt;int&gt; &gt; m;) 来做到这一点,然后使用 upper_bound 找到比请求的项目“更大”的第一项(但实际上更少,因为您颠倒了谓词)。如果您需要按升序进行迭代,则必须使用反向迭代器,这可能会让维护者(包括您自己)稍微感到困惑。仔细考虑您对这种可能的解决方案的需求。

    【讨论】:

      【解决方案3】:

      lower_bound 返回一个迭代器,指向不小于(即大于或等于)键的第一个元素。所以,最好使用 upper_bound 并始终减少迭代器:

      int find_first_element_less_than(int val)
      {
          auto uppper_node = m.upper_bound(val);
          if (uppper_node != m.begin())
              uppper_node--;
      
          return upuppper_node->second;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-11-06
        • 2012-11-04
        • 2012-10-22
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        相关资源
        最近更新 更多