使用std::find_if时,从传递给lambda的元素中获取迭代器



我正在尝试简化一个接收迭代器的递归函数。在函数的某个地方,有必要在从迭代器到向量末尾的范围内搜索与给定条件匹配的元素。所以,我想我可以使用find_if,如下所示:

typedef std::vector<Foo> FooVec;
FooVec v;
int f(FooVec::iterator it) {
  /* ... */
  auto it2 = std::find_if(it, end(v),
      [](const Foo& foo) {
        auto foo_it = /* obtain the corresponding iterator for foo. */
        return f(foo_it) == 0;
      });
  /* ... */
}

但是lambda函数接收的是一个元素,而不是当前元素的迭代器,所以我无法轻松地再次调用f。我可以在v中搜索foo以获得迭代器,但这将是低效的。或者,我可以使用带有迭代器的常规for循环。但我想知道在这种情况下是否有可能使用find_if

Messy,但v.begin() + (&foo - &v.front())是指向foo的迭代器。请注意,这只是因为vector具有连续存储:不要尝试使用listdeque

如果我是你,我会自己写循环。(是的,我知道,我通常说使用算法,但在这种情况下,自己做似乎更容易)。

未编译的代码如下:

for ( auto iter = it; iter != end(v); ++iter )
{
// *iter is the value; iter is the iterator
// if you have to search to the end, you can use [iter, end(v))
}

适用于所有容器:矢量、列表、deque等。

相关内容

  • 没有找到相关文章

最新更新