代码之家  ›  专栏  ›  技术社区  ›  kal

在C++映射中严格地返回小于给定键的最大密钥

  •  19
  • kal  · 技术社区  · 16 年前

    C++的STL映射有一种支持这一点的方法,因为在地图上的下限和上限会严格地返回大于传递值的值。

    Lower key

    time t1   = value1
    time t2   = value2
    time t2.5 = value3
    

    在这种情况下,如果我传递给这个映射t2.3,那么它应该给我值2。在地图上做一个下界并返回一个元素是否等同于“返回最大键严格小于给定键”即

    iterator = map.upper_bound(2.3)
    and then 
    iterator--;
    
    5 回复  |  直到 16 年前
        1
  •  25
  •   Johannes Schaub - litb    16 年前

    是的,下界也可以用,我以前见过,也用过。

    map_type::iterator it = map.lower_bound(2.3);
    if(it != map.begin()) {
        --it;
        // it now points at the right element
    }
    

    实际上会返回最大的,但更小的(如果它!= 地图.开始()是真的)一个。如果是在.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();
    }
    

    模板应该适用于 std::set 我也是。

        2
  •  8
  •   KenE    16 年前

    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)
    
        3
  •  3
  •   Mark Ransom    16 年前

    你的方法会起作用,但你需要检查以确保你没有回到地图的开头。另外,你需要的是下界,而不是上界。

    iterator = map.lower_bound(2.3)
    if (iterator != map.begin())
        --iterator;
    
        4
  •  1
  •   Rob K    16 年前

    find_if( map.rbegin(), map.rend(), is_less_than );
    

    您必须定义is \u less \u than()谓词函数。

    (参见。 http://www.cplusplus.com/reference/algorithm/find_if.html )

        5
  •  -1
  •   Jimmy    12 年前

    我总是发现计算楼层(x)和天花板(x)非常有用

    floor(x) -> greatest element <=x 
    ceil(x) -> smallest element >= x
    
    floor_it = m.lower_bound(x); 
    if (floor_it != m.end() && floor_it->first != x)
          --floor_it;
    
    ceil_it = m.upper_bound(x);
    if (ceil_it != m.end() && (ceil_it-1)->first == x)
        --ceil_it;