c++ - 二维 vector 初始化

标签 c++ vector

我放弃了将二维数组传递给函数的尝试,因为在编译时维度未知。经过一些研究,二维 vector 似乎是一个很好的替代品。我只是想确认这是声明维度 totalRows X totalColumns 的二维 vector 的正确方法,初始化每个单元格以包含空格字符:

vector<vector<char> > world(totalRows, vector<char>(totalColumns, ' '));

最佳答案

这条线本身应该可以正常工作并且看起来不错。但让我提供更多信息。

尝试使用标准库是个好主意。话虽如此,您需要了解您头脑中的二维数组图像必须线性存在于内存中。您可以轻松地创建一个 m*n 字符元素 vector (在您的示例中)并将其按行优先索引为 (i*n + j)(由从零开始的计数提供)。

事实上,这就是“二维”数组的工作方式。例如,当您创建一个常规元素数组 - T[][] 时,如果您尝试将其衰减为一个指针,它将是一个简单的 T* .在引擎盖下,内存是连续和线性布局的,没有形状,只有一条长街(如计算机所见)。它只是通过使用第一段中的表达式(或类似的表达式)来推断人类所看到的行和列的概念。计算机不关心。

vector 是标准库的一个很好的部分,它以一种签名 C++(而不仅仅是臃肿的 C)的方式封装数组。它的设计使得内部数组数据结构的大小调整变得容易,并且随着 C++11 的出现,移动语义可以使调整大小的操作成本更低。此外,RAII 的概念适用于此,在构造函数中仔细初始化数据成员并在析构函数中解除它们的想法使您能够避免作为用户的动态内存分配问题,并简单地在堆栈上传播新对象,当他们需要“退出”他们的范围时传递引用。

需要注意的一件事是 vector 创建了一个内部内存块,这是一个数组,由于弹出和压入新元素,它有时可能会超过实际数组的大小。此外,您不必一开始就定义它的大小,但可以通过 push_back、push_front 等轻松地扩展它。这意味着其他事情可以即时更改,即使使用移动语义,扩展也会花费很多.

偏离 vector 的唯一原因是当你在做一些面向数据的繁重的 3D 渲染或模拟时,并希望数据以一些非常自定义的、特定的方式打包并手动打乱,这很整洁 vector 可能不容易允许。但这会将您推向更底层的裸阵列领域(您应该为此做好准备)。你应该从中得到的关键是你可以简单地将“心理二维数组” vector (实际上,数据没有真正的几何形状,这就是我们这些弱小的人看到它的方式)作为 vector 并以不同的方式索引它们。确保你输入所有的行数据,按顺序,一个接一个,你会得到一个非常简单的布局,可以用 (i*n + j) 简单地探测/索引,其中 [i,j] 是经典的二维矩阵订阅/索引。

那么,它可以像这样简单:

vector<char> world(totalRows*totalColumns, ' ');

然后您只需通过引用传递它需要去的地方,在正确推送数据后将其索引为 (i*n + j)。

您的代码应该可以工作,但不必要的膨胀可能会在尝试操作数据、移动数据和编写不必要的东西时引入不必要的精神开销,这比实际使用 i*n+j“手动索引”方法来保持你对二维数组/字符矩阵的印象。如果愿意,您甚至可以覆盖功能以添加语法糖。

关于c++ - 二维 vector 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11180146/

相关文章:

c++ - c++模板中的多个类型名参数? (可变参数模板)

c++ - 在其他类中声明的私有(private)成员

c++ - 将每行两个单词的文件读取到 2 个不同的 vector 中

MATLAB - 根据向量的排序方式对矩阵进行排序

c++ - 如何解析PE文件不使用API

c++ - 避免为每个成员变量重复函数

java - 如何在 Java 中获取 vector <String> 数组作为返回值?

用一个因素替换另一个因素(在数据框内)

C++将多个对象序列化到一个文件并反序列化有限数量的对象

c++ - 如何为共享内存映射选择固定地址