c ++ std::map 获取最高键低于 X 的元素?

use*_*112 4 c++ stl stdmap c++11

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

所以如果我有:

map = {{1,'x'}, {2, 'g'}, {3, 'n'}, {3, 'm'}, {4, 'z'}, {5, 'a'}}
Run Code Online (Sandbox Code Playgroud)

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

{{3, 'n'}, {3, 'm'}}
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*hik 5

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

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

假设您没有取回begin()值(表明地图中没有符合您条件的键),只需减少返回的迭代器。


Tob*_*ght 5

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

代码

#include <iostream>
#include <map>

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';
   }
}
Run Code Online (Sandbox Code Playgroud)

输出

#include <iostream>
#include <map>

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';
   }
}
Run Code Online (Sandbox Code Playgroud)