rvalue reference (&&) in for each loop
Читаю книгу Адитья Бхаргава "Грокаем алгоритмы". В одной из глав говорится про графы и алгоритм для нахождения кратчайшего пути. Так как учу с++, у автора на github залит собственный код https://github.com/egonSchiele/grokking_algorithms/blob/master/06_breadth-first_search/c%2B%2B11/01_breadth-first_search.cpp.
Прошу, умоляю объяснить как работает данный участок кода
for (auto&& friend_name : graph.find(name)->second)
search_queue.push(friend_name);
А именно почему решили использовать rvalue и почему graph.find(name)->second вообще работает :D.
Спасибо.
Ответы (1 шт):
Очевидно, что graph.find(name) по ключу name возвращает итератор на элемент(Но тут проблема, если такого ключа нет, и операция с итератором станет недействительной). Как и всегда, нужно применить оператор ->, чтобы через итератор ссылаться на элемент контейнера. А типом элемента является пара(ключ(first), значение( second)). В итоге:
graph.find(name)->second
что эквивалентно выражению:
graph[name], c разницей, что последнее является lvalue ссылкой, а ее нельзя привязать к rvalue
выдаст значение(в данном случаи вектор) по ключу .
Чтобы избежать накладных расходов при копировании вектора в очередь, его(владение ресурсами) перемещают, передавая в функцию член push r-value ссылку, поскольку очередь нужна как временное хранилище.
P.S. Механизм семантики перемещения, когда и как использовать лучше изучать по учебникам