C++向量,这段代码是什么意思

C++ vector, what does this code mean?

本文关键字:代码 是什么 意思 向量 段代码 C++      更新时间:2023-10-16

我有这个代码:

 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是一个参考,它正在接收一个"Edge"结构,但我对'g[u][j]'感到困惑。

源代码在这里

提前感谢!:)

int nodes = maxnodes, src, dest;

这意味着所有节点都是整数,并且节点使用 maxnode 初始化

vector<Edge> g[maxnodes]是向量数组。

矢量就像一个动态数组。g[x] 将指向一个向量。g[x][y] 将指向一个边。

int nodes = maxnodes, src, dest;

这里nodes, src, dest都是整数,其中nodes初始化maxnodes其他整数未初始化。

vector<Edge> g[maxnodes];

正如@milleniumbug提到的g是一个向量的 C 数组:

g[u][j] 将给出数组g的第u个元素的第i个元素。u g 元素是一个向量,您可以在其中使用 [] 运算符访问其成员。

1) int nodes = maxnodes, src, dest;

在这里,nodes是一个初始化int,其值与 maxnodes 的值相同。 srcdest也是int,但没有初始值。

2) vector<Edge> g[maxnodes];

g这里是一系列std::vector.

Edge &e = g[u][j];

问。什么是g[u][j]

一个。它是存储在第 u 行和第 j 列的g中的Edge

问。 g vector填充了Edge结构,它怎么能像数组一样工作?

一个。因为std::vector在其定义中operator[]超载。参考: http://en.cppreference.com/w/cpp/container/vector/operator_at

它是一个向量的 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}

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] 在具有索引 u 的数组向量中给出索引为 Edge 的对象,其索引为 j

双屏

Edge &e = g[u][j];

声明对类型 Edge 的此对象的引用。

我相信其他人已经解释了每行做得好的地方。我只是在第二行指出,

Edge &e = g[u][j];

该代码将Edge放在引用中的g[u][j],大概是为了使以下代码更易于读取和写入(而不是多次重复g[u][j])。