Возврат из поиска по нескольким картам с помощью equal_range без ошибок
-
20-09-2019 - |
Вопрос
Я собираюсь провести рефакторинг некоторого дублированного кода.Обе функции выполняют поиск в мультикарте с помощью equal_range().В цикле for после вызова equal_range() есть цикл for, который устанавливает итератору значение equalRange.first с условием it != equalRange.second.
Если найдено правильное значение, то эти две функции различаются.Что я хотел бы сделать, так это иметь функцию поиска в качестве собственной справочной функции, используемой ранее упомянутыми двумя.
Заставить это работать - не проблема.Проблема в том, что я не могу найти способ сделать это "простым" и проверенным на будущее способом, который имеет смысл для других людей, использующих этот код.Очевидно, я хотел бы, чтобы что-то вернулось из функции поиска.
Если бы я должен был вернуть логическое значение, чтобы указать, было ли найдено значение в multimap, я бы должен был передать итератор в multimap, который указывает на элемент.Я нахожу это довольно некрасивым.
Если вместо этого был возвращен итератор, мы, конечно, должны проверить это на соответствие границам в двух функциях, которые используют функцию поиска.Мы не можем проверить его против Мультикарты.конец (), поскольку мы используем equal_range так equalRange.второй не обязательно равные Мультикарты.конец().
Используя функцию проверки границ returnIter == checkBound(x), где checkBound(x) возвращает multimap::upperbound(x) информирует checkBound (x) о реализации equal_range функции поиска.Следовательно, если кто-то другой изменит функцию поиска, флажок (x) может работать не так, как ожидалось.
Моя постоянная точка зрения здесь заключается в том, что пользователи функции поиска не должны быть обеспокоены тем, как она реализована, т. е. не должны знать, что она использует equal_range .
Каковы ваши предложения по этому поводу?Не слишком ли я здесь подробен?Как бы вы реализовали функцию поиска?
Спасибо
Решение
Вместо решения "или / или" относительно возвращаемого значения, мне кажется, что вы хотели бы выполнять такие функции, как map::insert
сделать - вернуть std::pair<iterator, bool>
чтобы сигнализировать как о местоположении, так и об успешном / неудачном выполнении функции поиска.