Что я могу сделать, чтобы улучшить этот поиск в векторе указателей? - PullRequest
0 голосов
/ 06 сентября 2018

Моя цель - проверить вектор Person* для объекта Person с именем person_name. Вектор отсортирован по именам в алфавитном порядке. Выполнение temp Person - единственный способ заставить этот вызов lower_bound работать с именем. Есть ли более эффективный способ сделать это, или temp необходим для сравнения?

//person_name is a string
Person temp(person_name);
auto it = lower_bound(personVec.begin(), personVec.end(), &temp, personCompare());
if (it != personVec.end() && (*it)->getName() == person_name) {}
else { return false;  }

1 Ответ

0 голосов
/ 06 сентября 2018

temp не требуется. Вам нужен компаратор с правильной подписью.

Например, когда разыменование personVec.begin() приводит к Person*& и person_name имеет тип PersonName, тогда вы можете иметь компаратор такой подписи:

bool compare(Person* const& a, PersonName const& b);

Это просто обычная функция, но другие вызовы с такой подписью тоже будут работать. Тогда вы можете использовать lower_bound с person_name напрямую:

auto it = lower_bound(personVec.begin(), personVec.end(), person_name, compare);

Ваш общий вопрос был о том, как улучшить производительность. Это невозможно предположить, увидев 4 строчки программы. Это следует выяснить, профилировав всю программу под большой нагрузкой данных и проанализировав результаты. Например, это может быть такая сортировка, что personVec занимает намного больше времени, чем lower_bound. Тогда использование unordered_set вместо vector может дать намного лучшие результаты, чем оптимизация функции поиска в vector.

...