我有这段代码:
const int maxnodes = 5000;
struct Edge
{
int to, rev;
int f, cap;
};
vector<Edge> g[maxnodes];
这是可以理解的,但我后来看到它用作
Edge &e = g[u][j];
这里,'u,j'
是整数。什么是"g[u][j]"
? 'g'
是用'Edge'
结构填充的向量,它如何像数组数组一样?
我知道Edge &e
是一个参考,它正在接收一个&#39; Edge
&#39;结构,但我对'g[u][j]'
感到困惑。
源代码为here
提前致谢! :)
答案 0 :(得分:2)
int nodes = maxnodes, src, dest;
这意味着所有都是整数,节点用maxnodes
初始化 vector<Edge> g[maxnodes]
是向量数组。
Vector就像一个动态数组。 g [x]将指向一个向量。 g [x] [y]将指向边缘。
答案 1 :(得分:1)
int nodes = maxnodes, src, dest;
此处nodes, src, dest
是使用nodes
初始化maxnodes
的所有整数。其他人未初始化。
vector<Edge> g[maxnodes];
提到的@milleniumbug
g
是C矢量数组:
g[u][j]
将为i
数组u
元素提供g
元素。作为u
,g
的元素是一个向量,您可以使用[]
运算符访问其成员。
答案 2 :(得分:0)
它是一个C矢量数组
maxnodes = 5
的示例。
G[5]
0 -> std::vector<Edge>
1 -> std::vector<Edge>
2 -> std::vector<Edge>
3 -> std::vector<Edge>
4 -> std::vector<Edge>
如果g
的每个元素包含5个元素,它将看起来像这样
G
-
0 -> {0, 1, 2, 3, 4}
1 -> {0, 1, 2, 3, 4}
2 -> {0, 1, 2, 3, 4}
3 -> {0, 1, 2, 3, 4}
4 -> {0, 1, 2, 3, 4}
含义,g[u][j]
,例如g[2][3]
,将对应g
第二个元素的向量中的第三个元素。
g[2][3]
G
-
0 -> {0, 1, 2, 3, 4}
1 -> {0, 1, 2, 3, 4}
2 -> {0, 1, 2, ***3***, 4}
3 -> {0, 1, 2, 3, 4}
4 -> {0, 1, 2, 3, 4}
答案 3 :(得分:0)
此
int nodes = maxnodes, src, dest;
是一个等同于这三个声明的声明
int nodes = maxnodes;
int src;
int dest;
这个
vector<Edge> g[maxnodes];
是std::vector<Edge>
类型的对象数组的声明。您可以将下标运算符与数组一起使用。
因此,表达式g[u]
会生成索引为u
的数组元素,该索引是对std::vector<Edge>
类型对象的引用。
类std::vector
也会重载下标运算符。所以表达
g[u][j]
在索引为Edge
的数组的向量中为j
类型的对象提供索引u
。
Dcelaration
Edge &e = g[u][j];
声明对Edge
类型的此对象的引用。
答案 4 :(得分:0)
1)int nodes = maxnodes, src, dest;
此处,nodes
是int
初始化,其值与maxnodes
的值相同。 src
和dest
也是int
,但没有初始值。
2)vector<Edge> g[maxnodes];
g
这里是一个std::vector
数组。
Edge &e = g[u][j];
Q值。什么是g[u][j]
?
一个。 Edge
位于g
行和u
列的j
。
Q值。 g
vector
填充了Edge
结构,它怎么能像数组一样?
一个。因为std::vector
在其定义中已为自身重载operator[]
。请参阅:http://en.cppreference.com/w/cpp/container/vector/operator_at
答案 5 :(得分:0)
我相信其他人已经解释了每条线路的表现。我只是指出第二行,
Edge &e = g[u][j];
代码将Edge
放在g[u][j]
的引用中,大概是为了使下面的代码更易于读写(而不是多次重复g[u][j]
)。