【问题标题】:c++ std::map get element with highest key below X?c ++ std :: map获取X以下最高键的元素?
【发布时间】:2017-05-01 08:12:03
【问题描述】:

给定一个键为整数的 C++ 映射(或多映射),是否可以使用 STL 请求其键为低于给定数字的最大数字的元素范围?

如果我有:

map = {{1,'x'}, {2, 'g'}, {3, 'n'}, {3, 'm'}, {4, 'z'}, {5, 'a'}}

我想找到 4 之前的元素,它会返回:

{{3, 'n'}, {3, 'm'}}

(我对std::map 更感兴趣,但对std::multimap 也保留了一般性问题)。

【问题讨论】:

  • 听起来像你想要的std::lower_bound
  • @Bathsheba 为什么要删除?答案很好,只要放一个免责声明或修复它。

标签: c++ c++11 stl stdmap


【解决方案1】:

您正在寻找地图的upper_bound() 方法。

这实际上会将迭代器返回到映射中大于传入值的第一个键。

假设您没有取回 begin() 值(表示映射中没有符合您条件的键),只需递减返回的迭代器即可。

【讨论】:

  • 您省略了使用equal_range 获取所有具有该键的元素的部分(问题中的示例暗示了一个多重映射)。
【解决方案2】:

给定一个号码N,使用std::map::upper_bound(N-1)

#include <iostream>
#include <map>

int main()
{
   std::map<int, char> am = {{1,'x'}, {2, 'g'}, {3, 'm'}, {4, 'z'}, {5, 'a'}};
   auto iter = am.upper_bound(3);
   if ( iter != am.begin() )
   {
      --iter;
      std::cout << iter->first << ", " << iter->second << std::endl;
   }
}

输出:

3, m

【讨论】:

    【解决方案3】:

    您可以使用lower_bound() 查找所需元素之后的第一个元素,然后递减迭代器并使用equal_range() 访问与该元素匹配的所有元素:

    ##代码 #包括 #包括

    int main()
    {
       std::multimap<int, char> const
           m{{1,'x'}, {2,'g'}, {3,'n'}, {3,'m'}, {4,'z'}, {5 'a'}};
    
       auto i = m.lower_bound(4);
       if (i == m.begin()) {
           std::cerr << "No elements less than 4 were found\n";
       } else {
           --i;
           auto const range = m.equal_range(i->first);
           for (auto j = range.first;  j != range.second;  ++j)
               std::cout << j->first << ", " << j->second << '\n';
       }
    }
    

    ##输出

    3, n
    3, m
    

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 2013-03-03
      • 2010-12-21
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多