繁体   English   中英

C++ 不兼容的迭代器类型

[英]C++ Incompatible iterators types

我试图打印一个图表,编译器出错了。

错误如下: class "__gnu_cxx::__normal_iterator, std::allocator>> *, std::vector, std::allocator>>, std::allocator, std::allocator>>>>>" has no会员“开始”

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');
    }
}

在你的内部循环中, i是一个迭代器类型。 所以i必须取消引用以引用 object。

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()但是确实有效。

编辑:那么让我们添加另一个选项...使用即将到来的 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');
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM