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_ifSTL 算法是跨平台的并且与 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;})