返回最大的密钥严格小于C++ Map中给定的密钥

kal*_*kal 25 c++ stl

有没有一种方法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.


Ken*_*enE 7

如果您不关心顺序,则可以使用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)