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

Obtaining an iterator from the element passed to a lambda when using std::find_if

我正在尝试简化接收迭代器的递归函数。在函数的某处,有必要在从迭代器到向量末尾的范围内搜索与给定条件匹配的元素。所以,我想我可以使用 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

乱七八糟,不过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))
}

适用于所有容器:vector、list、deque 等