[英]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.