Open alexey-malov opened 4 years ago
Решил использовать фиксированный массив std::array
Но есть вопрос: пока экспериментировал с std::unordered_map и const&, увидел, что все равно можно вставлять новые элементы, даже при возвращении константной ссылки. Почему так?
std::unordered_map<std::string, char> const& GetHtmlEntitiesMap()
{
static std::unordered_map<std::string, char> htmlEntityMap = {
{ """, '"' },
{ "'", '\'' },
{ "<", '<' },
{ ">", '>' },
{ "&", '&' }
};
return htmlEntityMap;
}
Ниже:
auto entities = GetHtmlEntitiesMap();
entities.insert({ "foo", 'b' });
Никаких ошибок или предупреждений, и дебаггер показывает, что новый элемент присутствует
upd. разобрался. Если писать auto вместо auto const& в данном случае, то объект копируется.
https://github.com/miredirex/oop-course/blob/bd479e6108ba638b54e663b25eb4dbb737b7e93b/Task2/HtmlDecode/src/htmldecode.cpp#L3-L14
[x] Лучше возвращать константную ссылку на коллекцию. Ведь мы не собираемся модифицировать ее элементы.
[x] (Опционально) Для коллекции малого размера нет особой выгоды в использовании unordered_map. Здесь последовательный поиск в массиве пар при помощи std::find_if будет работать быстрее из-за того, что данные в кэше лежат близко друг к другу.