使用 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
具有连续存储:不要尝试使用 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))
}
适用于所有容器:vector、list、deque 等
我正在尝试简化接收迭代器的递归函数。在函数的某处,有必要在从迭代器到向量末尾的范围内搜索与给定条件匹配的元素。所以,我想我可以使用 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
具有连续存储:不要尝试使用 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))
}
适用于所有容器:vector、list、deque 等