в вашем внутреннем цикле i
- это тип итератора. Таким образом, i
должен быть разыменован для ссылки на объект.
for (std::list<std::pair<int, int>>::iterator j = (*i).begin(); j != (*i).end(); j++)
Однако вы также можете использовать оператор ->
, чтобы получить доступ к элементам объекта
for (std::list<std::pair<int, int>>::iterator j = i->begin(); j != i->end(); j++)
Затем вы можете использовать ключевое слово auto
, чтобы сэкономить на спецификацииитератор.
void printGraph(std::vector<std::list<std::pair<int, int>>> const& graph) {
for (auto i = graph.begin(); i < graph.end(); i++)
{
for (auto j = i->begin(); j != i->end(); j++)
printf("%d", j->first);
putchar('\n');
}
}
И, еще более компактно, вы можете использовать цикл for на основе диапазона (C ++ 11) и расширять пару посредством объявления структурированной привязки (C ++ 17)
void printGraph(std::vector<std::list<std::pair<int, int>>> const& graph) {
for (auto const& lst : graph) {
for (auto const& [first, second] : lst) {
printf("%d", first);
}
putchar('\n');
}
}
Во-вторых, std::list
имеет LegacyBidirectionalIterator , для которого не определено operator <()
. Таким образом, вы не можете использовать j < i.end()
. j != i.end()
работает, однако.
edit: ну, тогда давайте добавим еще одну опцию ... с появлением C ++ 20 вы сможете использовать диапазоны, поэтому циклы могут выглядеть следующим образом:
void printGraph(std::vector<std::list<std::pair<int, int>>> const& graph) {
std::ranges::for_each (graph, [](auto const& lst) {
std::ranges::for_each (lst, [](auto const& pr) {
printf("%d", pr.first);
});
putchar('\n');
});
}