有没有一种方法C++ STL Maps支持这一点,因为map上的lower_bound和upper_bound严格返回大于传递值的值.
用例我有一个带有时间的地图作为按键排序,因此在MAP中
time t1 = value1
time t2 = value2
time t2.5 = value3
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我传递给这个MAP t2.3,那么它应该给我value2.在地图上做一个lower_bound并返回一个等同于"返回最大密钥严格小于给定密钥"的元素,即
iterator = map.upper_bound(2.3)
and then
iterator--;
Run Code Online (Sandbox Code Playgroud)
Joh*_*itb 21
是的,lower_bound可以用于那个,我以前见过它并像那样使用它.
map_type::iterator it = map.lower_bound(2.3);
if(it != map.begin()) {
--it;
// it now points at the right element
}
Run Code Online (Sandbox Code Playgroud)
实际上会返回最大但更小的(如果它!= map.begin()为真).如果是.begin,则没有小键..end如果没有更少的元素并将这些内容打包到函数中,评论中的好主意是返回:
template<typename Map> typename Map::const_iterator
greatest_less(Map const& m, typename Map::key_type const& k) {
typename Map::const_iterator it = m.lower_bound(k);
if(it != m.begin()) {
return --it;
}
return m.end();
}
template<typename Map> typename Map::iterator
greatest_less(Map & m, typename Map::key_type const& k) {
typename Map::iterator it = m.lower_bound(k);
if(it != m.begin()) {
return --it;
}
return m.end();
}
Run Code Online (Sandbox Code Playgroud)
模板也应该起作用std::set.
如果您不关心顺序,则可以使用map :: upper_bound来获取所需的元素,但是您需要使用traits参数的std :: greater来定义map类,这样顺序就可以达到-低。
typedef std::map<double,MyClass,std::greater<double> > MyMap;
MyMap myMap;
myMap[1.5] = value1;
myMap[2.0] = value2;
myMap[3.0] = value3;
MyMap::iterator elt = myMap.upper_bound(2.5); // should be pair(2.0,value2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11368 次 |
| 最近记录: |