структуры, хранящиеся в списке в памяти
std::vector<S> s;
Бывает нужно поискать в этом списке структуру по какому-то полю этой структуры. Это можно сделать 2-мя способами:
1) Линейный поиск
std::find_if(s.begin(), s.end(), [&field](auto &r) {return r.field == field});
Минусы - при большом размере списка и частых запросах будет медленно работать
2) Сохранение нужного поля как ключа в мапе, и поиск по мапе
std::map<FieldType, S> mapS;
Плюсы очевидны - увеличение скорости поиска с линейного до логарифмического или константного (в случае unordered map)
Пока вроде все довольно очевидно и не стоит того, чтобы быть написанным в чате pro.cxx
Но теперь вопрос.
Предположим, что мы последовали второму пути и сделали map из наших структур.
И теперь нам понадобилось искать еще по какому-то полю из этой структуры. В результате опять приходим к 2-м вариантам
1) Линейный поиск по мапе
std::find_if(mapS.begin(), mapS.end(), [field2](const auto &r) {return r.second.field2 == field2})
Минус тотже, при большом размере списка и частых запросов неизбежно замедление
2) Сделать мапу с ключем по этому полю. Плюс - быстрый поиск, но минус - теперь нужно поддерживать и синхронизировать между собой 2 (а то и больше) структур.
Внимание, вопрос: есть ли какой-то еще один способ решить данную задачу?
boost.multi_index
Поля структуры константы?
Обсуждают сегодня