РЕШЕНО: std::find_if (Как правильно вызвать?)

Модератор: Модераторы разделов

Аватара пользователя
devilr
Сообщения: 2252
ОС: Mandriva => Gentoo (~amd64)

РЕШЕНО: std::find_if

Сообщение devilr »

Доброго времени суток!
Есть код

Код: Выделить всё

    typedef struct CMD
    {
        int cmd;
        QString cmd_text;
    } *cmd_t;
    QList<CMD> commands;
    
    ...
    foreach (CMD command, commands)
    {
        if(command.cmd == cmd)
        {
        	//что-то делаем
        	return;
        }
    }
    
До недавнего времени всё было хорошо, но потом появилось предупреждение "consider using std::find_if algorithm instead of a raw loop" на подобный способ поиска.
Как это можно правильно переписать, может кто сталкивался?
Последний раз редактировалось devilr 01.08.2020 15:08, всего редактировалось 1 раз.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1176
ОС: Gentoo

Re: std::find_if

Сообщение ormorph »

Это всего лишь предложение компилятора, так как усматривает готовый алгоритм STL для поиска, не факт что это ускорит программу. Можно просто плюнуть, а можно попробовать создать свою функцию предикат, которая будет делать сравнение и передать ее в find_if. Методы начала и конца уже реализованы в контейнерах qt - begin, end.
Тут показывается как выглядит реализация данного цикла и пример использования.

Зы: просто предлагает замену цикла foreach.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 2252
ОС: Mandriva => Gentoo (~amd64)

Re: std::find_if

Сообщение devilr »

Я читать умею. :)
Просто не понимаю, как в моём случае делать? Там ведь структура, а не просто переменная.
ormorph писал(а):
01.08.2020 14:33
не факт что это ускорит программу
Так я не ускорить хочу, а просто понять, как это делается?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17042
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: std::find_if

Сообщение Bizdelnick »

Как-то так:

Код: Выделить всё

auto cmd_it = find_if(
    commands.begin(),
    commands.end(),
    [cmd](CMD &command){ return command.cmd == cmd; }
);
if cmd_it != commands.end() {
    // что-то делаем
}
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1176
ОС: Gentoo

Re: std::find_if

Сообщение ormorph »

devilr писал(а):
01.08.2020 14:36
ведь структура, а не просто переменная.
Ну так и смотрите, там в функцию предиката передается объект структуры(указатель), ну а что с ним делать, можно добавить отладочную печать в предикате.
Предикат функция bool с аргументом типа итератор Qlist.. , он и будет указывать на структуру. Можно сразу в качестве аргумента указать структуру, итератор же указывает на структуру. Ну а дальше весь функционал в предикате.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 2252
ОС: Mandriva => Gentoo (~amd64)

Re: std::find_if

Сообщение devilr »

Bizdelnick, хитро. :)
Век живи - век учись! Спасибо!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали: