c++ std::map 获取最高键低于 X 的元素?
c++ std::map get element with highest key below X?
给定一个键为整数的 C++ 映射(或多映射),是否可以使用 STL 请求其键为小于给定数字的最大数字的元素范围?
所以如果我有:
map = {{1,'x'}, {2, 'g'}, {3, 'n'}, {3, 'm'}, {4, 'z'}, {5, 'a'}}
我想找到 4 之前的元素,它会 return:
{{3, 'n'}, {3, 'm'}}
(我对 std::map
更感兴趣,但也保留了 std::multimap
的一般性问题)。
您正在寻找地图的 upper_bound() 方法。
这实际上 return 指向映射中大于传入值的第一个键的迭代器。
假设您没有取回 begin()
值(表明映射中没有满足您条件的键),只需递减 returned 迭代器即可。
给定一个数字 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
您可以使用 lower_bound()
找到所需元素之后的第一个元素,然后递减迭代器并使用 equal_range()
访问与该元素匹配的所有元素:
##代码
#包括
#include
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
给定一个键为整数的 C++ 映射(或多映射),是否可以使用 STL 请求其键为小于给定数字的最大数字的元素范围?
所以如果我有:
map = {{1,'x'}, {2, 'g'}, {3, 'n'}, {3, 'm'}, {4, 'z'}, {5, 'a'}}
我想找到 4 之前的元素,它会 return:
{{3, 'n'}, {3, 'm'}}
(我对 std::map
更感兴趣,但也保留了 std::multimap
的一般性问题)。
您正在寻找地图的 upper_bound() 方法。
这实际上 return 指向映射中大于传入值的第一个键的迭代器。
假设您没有取回 begin()
值(表明映射中没有满足您条件的键),只需递减 returned 迭代器即可。
给定一个数字 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
您可以使用 lower_bound()
找到所需元素之后的第一个元素,然后递减迭代器并使用 equal_range()
访问与该元素匹配的所有元素:
##代码 #包括 #include
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