qt有类似STL的find_if吗?

时间:2016-06-29 13:16:54

标签: c++ qt qt4.8

想象一下,我有一个像这样的结构:

typedef struct
{
    foo *fara;
    int id;
} fooToIDWrapper_t;

QLinkedList<fooToIDWrapper_t *> FooWrapper;之类的,

现在我想得到列表fooToIDWrapper_t - 节点与特定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中我能以什么方式实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以在QLinkedList中使用find_if!这正是QLinkedList提供cbegincend的原因:

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之前使用constBeginconstEnd。所以你可以这样做:

any_of(bar.constBegin(), bar.constEnd(), [ID](const fooToIDWrapper& item) { return item.id == ID;})

如果您觉得在Qt4中不断使用the iterator libraries' accesors,那么您将无法使用const迭代器:

any_of(begin(bar), end(bar), [ID](const fooToIDWrapper& item) { return item.id == ID;})

答案 1 :(得分:0)

在这种情况下没有理由不使用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);