我们有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)
或者更复杂或更好的内存分配?
答案 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
的内部结构,并且可以在搜索过程中利用它,从而获得更好的性能。