2016-06-29 5 views
1

Представьте меня-структуру, как это:Есть ли у qt что-то вроде find_if из STL?

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

и QLinkedList<fooToIDWrapper_t *> FooWrapper; подобное,

Теперь я хочу, чтобы получить итератор, где списки fooToIDWrapper_t -node совпадающий с specfic идентификатор.

с STL-х std:find_if() я мог бы достичь этого, делая (просто пример кода, чтобы продемонстрировать, не проверяется на compilability):

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?

+5

ли Qt не поддерживает стандартную библиотеку? – NathanOliver

+0

@NathanOliver: Я должен добавить, что я полагаюсь на итератор. И должны признать, что не представляете, как это смешать. – dhein

+0

Нет, у него нет: http://doc.qt.io/qt-5/qtalgorithms.html (см .: Руководство по переносу). – Gluttton

ответ

1

Вы можете использовать QLinkedList в find_if! Это exactally почему 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;}) 

EDIT:

Вы все еще хотите использовать итераторы const, так как вы не пытайтесь изменить контейнер. Вам просто нужно будет использовать constBegin и constEnd перед Qt5. Таким образом, вы можете сделать это:

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

Если вы чувствуете, непрекращающийся необходимость использования the iterator libraries' accesors с Qt4 вы не сможете использовать const итераторы:

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

, это было бы отличным решением! Но, к сожалению, я ограничена qt 4.8 – dhein

+0

@Zaibis Не бойтесь, Qt4 также предоставил итераторы 'const', функции accessor просто имели нестандартные имена. Я отредактировал свой ответ, чтобы отразить это. –

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); 

 Смежные вопросы

  • Нет связанных вопросов^_^