想象一下,我有一个像这样的结构:
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中我能以什么方式实现这一目标?
答案 0 :(得分:1)
您可以在QLinkedList
中使用find_if
!这正是QLinkedList
提供cbegin
和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
和constEnd
。所以你可以这样做:
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_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);