C ++ несовместимые типы итераторов - PullRequest
0 голосов
/ 27 октября 2019

Я попытался напечатать график, и компилятор показал ошибку.

Ошибка выглядит следующим образом: class "__gnu_cxx :: __ normal_iterator, std :: allocator >> *, std :: vector, std:: allocator >>, std :: allocator, std :: allocator >>>>> "не имеет члена" begin "

То же самое происходит с end ().

Воткод:

void printGraph(std::vector<std::list<std::pair<int, int>>> graph)
{
    for (std::vector<std::list<std::pair<int, int>>>::iterator i = graph.begin(); i < graph.end(); i++)
    {
        for (std::list<std::pair<int, int>>::iterator j = i.begin(); j < i.end(); j++)
            printf("%d", (*j).first);
        putchar('\n');
    }
}

1 Ответ

1 голос
/ 27 октября 2019

в вашем внутреннем цикле 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');
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...