qt 是否有来自 STL 的 find_if 之类的东西?
Does qt have something like find_if from STL?
假设我有一个这样的结构:
typedef struct
{
foo *fara;
int id;
} fooToIDWrapper_t;
和 QLinkedList<fooToIDWrapper_t *> FooWrapper;
那样,
现在我想获取列表 fooToIDWrapper_t
-node 与特定 id 匹配的迭代器。
使用 STL std:find_if()
我可以通过以下方式实现这一点(仅用于演示的示例代码,未检查可编译性):
vector<fooToIDWrapper_t> bar;
auto pred = [ID](const fooToIDWrapper& item) {
return item.id == ID;
};
std::find_if(std::begin(bar), std::end(bar), pred) != std::end(bar);
qt有没有类似的算法?如果不是这样,正如我假设的那样,我可以通过什么方式在 qt 中实现这一目标?
在这种情况下没有理由不使用 std::find_if
。 STL
算法是跨平台的并且与 Qt
容器兼容。 QtAlgorithm
库中没有类似的算法
QLinkedList<fooToIDWrapper_t *> bar;
auto pred = [ID](const fooToIDWrapper& item) {
return item.id == ID;
};
std::find_if(bar.begin(), bar.end(), pred) != std::end(bar);
您可以在 find_if
中使用 QLinkedList
!这正是 QLinkedList
提供 cbegin
and cend
:
的原因
find_if(cbegin(bar), cend(bar), [ID](const fooToIDWrapper& item) { return item.id == ID;} ) != cend(bar)
还要考虑:any_of
这似乎更有意义,因为您只是要将生成的迭代器与 cend(bar)
:
进行比较
any_of(cbegin(bar), cend(bar), [ID](const fooToIDWrapper& item) { return item.id == ID;})
编辑:
您仍想使用 const
迭代器,因为您不想修改容器。你只需要在 Qt5 之前使用 constBegin
and constEnd
。所以你可以这样做:
any_of(bar.constBegin(), bar.constEnd(), [ID](const fooToIDWrapper& item) { return item.id == ID;})
如果你觉得不断需要在 Qt4 中使用 ,你将无法使用 const
迭代器:
any_of(begin(bar), end(bar), [ID](const fooToIDWrapper& item) { return item.id == ID;})
假设我有一个这样的结构:
typedef struct
{
foo *fara;
int id;
} fooToIDWrapper_t;
和 QLinkedList<fooToIDWrapper_t *> FooWrapper;
那样,
现在我想获取列表 fooToIDWrapper_t
-node 与特定 id 匹配的迭代器。
使用 STL std:find_if()
我可以通过以下方式实现这一点(仅用于演示的示例代码,未检查可编译性):
vector<fooToIDWrapper_t> bar;
auto pred = [ID](const fooToIDWrapper& item) {
return item.id == ID;
};
std::find_if(std::begin(bar), std::end(bar), pred) != std::end(bar);
qt有没有类似的算法?如果不是这样,正如我假设的那样,我可以通过什么方式在 qt 中实现这一目标?
在这种情况下没有理由不使用 std::find_if
。 STL
算法是跨平台的并且与 Qt
容器兼容。 QtAlgorithm
库中没有类似的算法
QLinkedList<fooToIDWrapper_t *> bar;
auto pred = [ID](const fooToIDWrapper& item) {
return item.id == ID;
};
std::find_if(bar.begin(), bar.end(), pred) != std::end(bar);
您可以在 find_if
中使用 QLinkedList
!这正是 QLinkedList
提供 cbegin
and cend
:
find_if(cbegin(bar), cend(bar), [ID](const fooToIDWrapper& item) { return item.id == ID;} ) != cend(bar)
还要考虑:any_of
这似乎更有意义,因为您只是要将生成的迭代器与 cend(bar)
:
any_of(cbegin(bar), cend(bar), [ID](const fooToIDWrapper& item) { return item.id == ID;})
编辑:
您仍想使用 const
迭代器,因为您不想修改容器。你只需要在 Qt5 之前使用 constBegin
and constEnd
。所以你可以这样做:
any_of(bar.constBegin(), bar.constEnd(), [ID](const fooToIDWrapper& item) { return item.id == ID;})
如果你觉得不断需要在 Qt4 中使用 const
迭代器:
any_of(begin(bar), end(bar), [ID](const fooToIDWrapper& item) { return item.id == ID;})