C ++ map从迭代器位置开始搜索

时间:2013-07-21 04:23:30

标签: c++ stl find

我的问题如下:

在std :: map上使用find来获取指向所需元素对的迭代器之后,是否可以在后续的find()中重用该迭代器以利用知道我看中的元素之后是否接近第一个找到的元素?类似的东西:

std::map<key, value> map_elements;
std::map<key, value>::iterator it;

it = map_elements.find(some_key);
it = it.find(a_close_key)

提前谢谢

2 个答案:

答案 0 :(得分:2)

如果您确定附近有 ,则可以使用std::find(而不是map::find)对该项进行线性搜索。如果它在当前位置的大约log(N)项内,则可能是胜利(其中N是地图中的项目数)。

另请注意,您必须确定是否要在当前位置之前或之后进行搜索,并指定currentend()(如果之后)和begin(), current(如果是)之前。如果是之前,你会想要进行反向搜索(find_end,如果内存服务),因为目标可能接近该范围的结束。

答案 1 :(得分:1)

关于Item1(由map :: find找到)距离Item2多远,你的问题还不完整。在某些情况下,它更有效地制作新的map::find;在某些情况下,您可以迭代迭代器以找到第二个项目的位置。仅使用搜索map::find,它将是O(log n)复杂度,它可以是大约10-20步。

所以,如果你知道你的Item2不是那么远,你可以迭代it迭代器来找到它。这里最重要的是如何检查你必须停止搜索。 std::map默认使用std::less<T>来排列项目,因此可以用来查找容器根本不包含Item2。这样的事情(未经测试):

std::map<key, value> map_elements;
std::map<key, value>::iterator it, it2;

it2 = it = map_elements.find(some_key);
bool found=false;
while( it2!=map_elements.end() && !(a_close_key < it2->first) ) {
   if( !(a_close_key < it2->first) && !(it2->first < a_close_key) ) {
      //Equivalency is not ==, but its what used in std::map
      found=true;
      break;
   }
   it2++;
}
if( found ) {
   //.... use it2
}

if( found )内阻止您的迭代器it2值应与调用map_elements.lower_bound(a_close_key)

时相同