std :: map,std :: equal_range和比较函数

时间:2012-10-01 14:47:36

标签: c++ maps

如果我有一个使用比较函数(仿函数)插入键的地图/多图,是否可以将map :: equal_range与比较函数一起使用?例如,如果我有一个std :: map m和keys:

sometype a.getVal == 101
sometype b.getVal == 112 <-first pair (using equal_range)
sometype c.getVal == 113
sometype d.getVal == 121 <-second pair (using equal_range)

我希望得到一个范围/一组键11 *可能吗?

2 个答案:

答案 0 :(得分:1)

有一个很好的理由说明你不能将map::equal_range()与自定义比较器一起使用:它会破坏容器的同生性。它可以完成,但算法将是O(n)而不是O(log(n)),因为它必须比较所有map元素而不管它们的位置。

我认为针对您的问题的最佳解决方案是使用map::lower_bound()map::upper_bound()来查找间隔限制的自定义函数。类似的东西:

typedef std::map<int>::iterator Iter;
std::pair<Iter, Iter> CustomEqualRange (const std::map<int>& theMap, int lowerBound, int range)
{
  Iter lower = theMap.lower_bound(lowerBound);
  Iter upper = theMap.upper_bound(lowerBound + range);
  return std::make_pair(lower, upper);
}

答案 1 :(得分:0)

equal_range功能不提供此功能,但您可以调用lower_bound传递getVal == 110的值,upper_bound传递getVal == 120的值。这对迭代器应该表示半开范围内的所有值[110,120]。