在c ++ map中查找最大元素

时间:2013-08-16 16:48:53

标签: c++ map stl

我们有C++ map<double, class_name> mymap。 我们得到了一些双X

任务是在mymap中查找与小于等于X的最大键相关联的值。如果X小于mymap的最低键,则返回之前声明的默认值。

我的方法是遍历mymap并找到小于或等于X的最大键

double max = std::numeric_limits<double>::lowest();

for ( auto ii=mymap.begin(); ii!=mymap.end(); ++ii ) {
  if (
    (*ii).first <= value && 
    (*ii).first > max
  ) {
    max = (*ii).first;
  }
}

if ( max==std::numeric_limits<double>::lowest() )
    return defaultValue;

return colorset.find(max)->second;

这是正确的做法吗? 我是c ++地图的新手,所以我想知道可能有更好的方法来实现这个任务吗?

我认为算法的复杂度为O(n),可能有一种方法可以找到它O(log n)或者更复杂或更好的内存分配?

1 个答案:

答案 0 :(得分:7)

您可以使用map::lower_bound查找大于或等于X的最小元素,检查您是否有begin()迭代器来确定该值小于最小值地图中的一个,然后返回一步,转到不超过X的最大密钥:

map<double, class_name>::const_iterator iter = mymap.lower_bound(X);
if (iter->first == X || iter != mymap.begin()) {
    if (iter->first != X) --iter;
    cerr << iter->second << endl;
} else {
    cerr << "<default>" << endl;
}

与普通循环(按顺序迭代所有键)不同map::lower_bound知道std::map的内部结构,并且可以在搜索过程中利用它,从而获得更好的性能。

Here is a demo on ideone.