所以我不习惯硬件关闭编程,指针和内存总是为我完成,但因为我想学习 C++,我想尝试一个二维数组,由于未知大小而不起作用,所以我决定去带有 2d 列表。
我现在遇到的问题是我不知道程序将如何运行,在我可以测试它之前,我想知道值是否会被复制、覆盖等。
#include "board.h"
#include "list"
using namespace std;
void Board::initiate_board()
{
list<list<int>> list_of_rows;
for (int rows = 0; rows++; rows < Board::rows) {
list<int> new_row;
for (int columns = 0; columns++; columns < Board::columns) {
new_row.push_back(0);
}
list_of_rows.push_back(new_row);
}
}
Run Code Online (Sandbox Code Playgroud)
这应该做的是创建一个填充 0 的 2d 列表。我不知道存储中会发生什么,而且我无法可视化 RAM 并知道是什么(如果可以的话,我会不知所措)所以我希望有人能帮我解决这个问题。
我认为这段代码的作用是创建一个 0 列表,将其放入另一个列表中,然后启动一个新列表,自动删除旧列表,因为它不会被引用或会被覆盖(不知道是哪个)。所以当行和列在 4 时,它看起来像
|0|0|0|0| => ... => |0|0|0|0|
|0|0|0|0|
|0|0|0|0|
|0|0|0|0|
Run Code Online (Sandbox Code Playgroud)
我不确定的两件事是 A:会创建一个新列表吗?或者旧的会像这样增加:
|0|0|0|0|
|0|0|0|0|0|0|0|0|
|0|0|0|0|0|0|0|0|0|0|0|0|
|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
Run Code Online (Sandbox Code Playgroud)
第二个问题是:列表会被复制还是引用会被存储?那么在将 4-long-list 保存到第一个列表后会增加原始列表,并且因为只保存了一个引用,所以将列表 [0] 也增加到 8 长,这样如果我改变了列表中的第二个值每一行都会改变吗?
|0|0|0|0| => |0|0|0|0|0|0|0|0|
|0|0|0|0|0|0|0|0|
Run Code Online (Sandbox Code Playgroud)
我知道这个问题对于了解 C++ 的人来说可能是非常基本的,但是因为我来自 dart 和 python,而 C# 是我知道的最接近硬件的语言,这让我感到困惑。除了通过打印列表列表或只是猜测来尝试之外,有没有办法知道会发生什么?
如果我想保存一个引用而不是一个副本到列表中,我该怎么做呢?
我建议您阅读一本关于现代 C++ 基础知识的好书。C++ 是一种具有挑战性的语言,具有陡峭的学习曲线和悠久的遗产。关于对象生命周期、不同类型的构造和初始化等,有很多东西需要学习——从一本涵盖这些主题的好书开始会更容易。
回答您的问题:代码将按照您期望的方式工作;您将创建一个std::list包含rows std::lists,每个包含columns 0s。
也就是说,您将生成一个容器的容器,逻辑上[1]如下所示:
<--columns-->
^ |0|0|...|0|0|
| |0|0| |0|0|
| . . .
rows . . .
| . . .
| |0|0| |0|0|
V |0|0|...|0|0|
Run Code Online (Sandbox Code Playgroud)
C++ 中的变量有与其关联的生命周期,通常与它们所在的范围相关。new_row从它在for循环中定义的地方开始它的生命周期,并在每次迭代的循环的右大括号处销毁。
更一般地,所有对象都以作用域结束时声明的相反顺序销毁;循环只是一个多次出现的作用域。
所以在你上面的代码中,发生的事情是:
new_row使用 0 个元素创建了一个名为的列表columns 0s 被推入其中(内循环)list_of_rows 复制 new_rownew_row 被销毁(范围结束)。rows 次从技术上讲,因为list_of_rows没有使用,它会在函数作用域的末尾被销毁——尽管我假设为了简洁起见省略了它的使用
[1]我建议您考虑使用std::vector而不是std::list,这可能更接近您打算使用的内容。
std::vector是动态数组类型(连续存储),而std::list实际上是双向链表实现。这意味着您不能简单地对std::list(eg list_of_rows[1][2]) 进行索引,因为访问需要遍历列表。std::vector没有这个问题。
您的list<list<...>>实现实际上更接近于:
<--------columns-------->
^ |*| --> |0| <-> |0| ... |0| <-> |0|
| ^
| |
| V
| |*| --> |0| <-> |0| ... |0| <-> |0|
| .
rows .
| .
| |*| --> |0| <-> |0| ... |0| <-> |0|
| ^
| |
| V
V |*| --> |0| <-> |0| ... |0| <-> |0|
Run Code Online (Sandbox Code Playgroud)
而vector<vector<...>>实现将是:
<--columns-->
^ |*| -> |0|0|...|0|0|
| |*| -> |0|0| |0|0|
| . . .
rows . . .
| . . .
| |*| -> |0|0| |0|0|
V |*| -> |0|0|...|0|0|
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |