В качестве предисловия к этому вопросу я должен сказать, что я программист Java и поэтому гораздо больше привык к семантике Maps в Java, чем в C++. В Java это довольно распространено, и ожидается, что при поиске ключа на карте будет возвращено null
. Я перевожу часть нашего кода на С++ и пытаюсь найти способ С++ делать что-то при взаимодействии с unordered_map.
В частности, у меня есть класс, который содержит unordered_map. Вместо того, чтобы отображать карту непосредственно в клиентском коде, у меня есть 2 функции-оболочки: одна для помещения пары ключ/значение в карту, а другая для извлечения значения для указанного ключа, т.е.:
void set_tag_value(string tag, string value);
string& get_tag_value(string tag);
Если я использую unordered_map.at()
для извлечения значения, то он выдаст исключение, которое мой код должен будет перехватить, или, альтернативно, разрешить его распространение на клиентский код. (Однако распространение исключения на кажется мне недружественным).
Возможно, альтернативой было бы изменить возвращаемое значение на тип string*
и вернуть NULL, если он не найден (что является способом сделать это в Java), но тогда пользователю необходимо проверить наличие NULL (что также не так удобно).
Итак, мой вопрос состоит из двух частей:
Каков удобный для разработчиков способ обработки неудачного поиска и какое возвращаемое значение было бы полезно (исключение, NULL, пустая строка или что-то еще)?
Внутри моего кода, какой метод поиска карты более типичен для использования, когда вы ожидаете, что он может не найти ключ, at() и исключение перехвата, или найти и проверить итератор == map.end()? (Эта часть вопроса заключается в том, что я просто пытаюсь изучить способ работы С++).
Спасибо за любой совет!
boost::optional
илиstd::optional
(С++ 14). Подробнее в моем ответе здесь. - person milleniumbug   schedule 05.10.2013unordered_map
уже предоставляет довольно абстрактный интерфейс, функциональный и хорошо спроектированный. Что еще более важно, каждый, кто знает C++, уже знает, как его использовать. Практически все, чего вы добиваетесь, скрывая это, — это создаете другой (менее функциональный) интерфейс для изучения вашими пользователями. - person Jerry Coffin   schedule 06.10.2013