使用 C++ 向量的有向图的邻接表表示
Adjacency list representation of a directed graph using c++ vector
我是新人。我正面临 C++ 向量及其迭代器的问题。我试图表示有向图的邻接表但失败了。这是我的代码:`
#include <bits/stdc++.h>
using namespace std;
int main()
{
int Node,Edge,node1,node2,cost;
vector<int>nodes[100],costs[100];
vector<int>::iterator it;
cout<<"Enter numbers of nodes: "<<endl;
cin>>Node;
cout<<"Enter numbers of edges: "<<endl;
cin>>Edge;
for(int i=0;i<Edge;i++){
cout<<i+1<<"th edge's Node1: ";
cin>>node1;
cout<<i+1<<"th edge's Node2: ";
cin>>node2;
cout<<"Cost from "<<node1<<" to"<<node2<<": ";
cin>>cost;
cout<<endl;
nodes[node1].push_back(node2);
costs[node1].push_back(cost);
}
for(it=nodes.begin();it<nodes.end();it++){
for(int i=0;i<nodes[it].size();i++){
cout<<nodes[it][i]<<" ";
}
cout<<endl;
}
return 0;
}
`
您应该告诉我们您遇到的编译错误。
尝试立即编译代码显示循环不一致:
for(it=nodes.begin();it<nodes.end();it++)
以及 it
的以下用途。事实上,您在索引中使用 it
,就好像它是 int
一样。但是您已将其声明为迭代器:
vector<int>::iterator it; // you say it is an iterator that iterates through integers in ONE vector
索引访问和迭代器是两个不同的概念。
方案一:使用索引
只需使用 int
类型的索引(或更好的 size_t
):
...
const size_t maxnodes=100;
vector<int>nodes[maxnodes],costs[maxnodes];
// + remove the definition of it
...
for(size_t it=0;it<maxnodes;it++) {
...
解决方案 2:使用迭代器,但要正确
让编译器为迭代器定义正确的类型,然后取消对迭代器的引用(即像处理指针一样处理它):
// remove the definition of the it at the begin of main
... // rest of code unchanged except for the loop
for(auto it=begin(nodes);it!=end(nodes);it++){ // attention at the condition
for(int i=0;i<it->size();i++){
cout<<(*it)[i]<<" ";
}
cout<<endl;
}
这里是live demo
方案三:使用舒适的范围
忘记迭代器,让编译器为您处理工作:
for(auto& n : nodes) { // note the &, to get the original element and not a clone of it
for(int i=0;i<n.size();i++){
cout<<n[i]<<" ";
}
cout <<endl;
}
这里还有一个live demo.
您会立即意识到您也可以使用范围来处理内部循环:
for(int& target : n) { // when reading the code outloud, say " in " instead of ":"
cout<<target<<" ";
}
最后的评论
您应该始终验证用户的数据输入,特别是如果您将其用作索引,请确保它在有效范围内。
我是新人。我正面临 C++ 向量及其迭代器的问题。我试图表示有向图的邻接表但失败了。这是我的代码:`
#include <bits/stdc++.h>
using namespace std;
int main()
{
int Node,Edge,node1,node2,cost;
vector<int>nodes[100],costs[100];
vector<int>::iterator it;
cout<<"Enter numbers of nodes: "<<endl;
cin>>Node;
cout<<"Enter numbers of edges: "<<endl;
cin>>Edge;
for(int i=0;i<Edge;i++){
cout<<i+1<<"th edge's Node1: ";
cin>>node1;
cout<<i+1<<"th edge's Node2: ";
cin>>node2;
cout<<"Cost from "<<node1<<" to"<<node2<<": ";
cin>>cost;
cout<<endl;
nodes[node1].push_back(node2);
costs[node1].push_back(cost);
}
for(it=nodes.begin();it<nodes.end();it++){
for(int i=0;i<nodes[it].size();i++){
cout<<nodes[it][i]<<" ";
}
cout<<endl;
}
return 0;
}
`
您应该告诉我们您遇到的编译错误。
尝试立即编译代码显示循环不一致:
for(it=nodes.begin();it<nodes.end();it++)
以及 it
的以下用途。事实上,您在索引中使用 it
,就好像它是 int
一样。但是您已将其声明为迭代器:
vector<int>::iterator it; // you say it is an iterator that iterates through integers in ONE vector
索引访问和迭代器是两个不同的概念。
方案一:使用索引
只需使用 int
类型的索引(或更好的 size_t
):
...
const size_t maxnodes=100;
vector<int>nodes[maxnodes],costs[maxnodes];
// + remove the definition of it
...
for(size_t it=0;it<maxnodes;it++) {
...
解决方案 2:使用迭代器,但要正确
让编译器为迭代器定义正确的类型,然后取消对迭代器的引用(即像处理指针一样处理它):
// remove the definition of the it at the begin of main
... // rest of code unchanged except for the loop
for(auto it=begin(nodes);it!=end(nodes);it++){ // attention at the condition
for(int i=0;i<it->size();i++){
cout<<(*it)[i]<<" ";
}
cout<<endl;
}
这里是live demo
方案三:使用舒适的范围
忘记迭代器,让编译器为您处理工作:
for(auto& n : nodes) { // note the &, to get the original element and not a clone of it
for(int i=0;i<n.size();i++){
cout<<n[i]<<" ";
}
cout <<endl;
}
这里还有一个live demo.
您会立即意识到您也可以使用范围来处理内部循环:
for(int& target : n) { // when reading the code outloud, say " in " instead of ":"
cout<<target<<" ";
}
最后的评论
您应该始终验证用户的数据输入,特别是如果您将其用作索引,请确保它在有效范围内。