Вставить или обновить ключ во вложенной неупорядоченной карте - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь обновить ключ во вложенной карте, если он существует, или вставить его, если его нет. Я пытаюсь использовать итератор с lower_bound, чтобы сделать этот процесс эффективным.

std::unordered_map<std::string, std::unordered_map<std::string, std::string>> maps;
cache::iterator iter(maps[command[1]].lower_bound(command[2]));
if (iter == maps[command[1]].end() || command[2] < iter->first) {
  maps[command[1]].insert(iter, std::make_pair(command[2], command[3]));
} else {
  iter->second = command[3];
}

Я получаю следующую ошибку во время компиляции: no member named 'lower_bound' in 'std::unordered_map<std::basic_string<char>, std::basic_string<char>, std::hash<std::string>, std::equal_to<std::basic_string<char> >, std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > > >'

1 Ответ

1 голос
/ 29 марта 2019

Как следует из названия, unordered_map не упорядочен каким-либо особым образом. Поскольку lower_bound методы и функции относятся к порядку элементов, они имеют смысл только для упорядоченных данных. Поэтому для unordered_map такого метода не существует.

Многие тесты многих компиляторов показали, что std::map с менее чем тысячей элементов значительно быстрее, чем std::unordered_map. Это означает, что вам следует рассмотреть возможность перехода на std::map или использовать следующее:

maps[command[1]].insert_or_assign(command[2], command[3]);
...