我正在尝试简化一个接收迭代器的递归函数。在函数的某个地方,有必要在从迭代器到向量末尾的范围内搜索与给定条件匹配的元素。所以,我想我可以使用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
具有连续存储:不要尝试使用list
或deque
。
如果我是你,我会自己写循环。(是的,我知道,我通常说使用算法,但在这种情况下,自己做似乎更容易)。
未编译的代码如下:
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等。