2d矢量初始化

Alm*_*ely 2 c++ vector

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

vector<vector<char> > world(totalRows, vector<char>(totalColumns, ' '));
Run Code Online (Sandbox Code Playgroud)

小智 9

线本身应该工作,看起来很好.但是,让我提供更多信息.

尝试使用标准库是个好主意.话虽如此,你需要了解你头脑中的2D阵列的图像必须在内存中线性存在.您可以轻松地创建一个字符的m*n元素向量(在您的示例中),并将其作为行(主要是明确的)索引为(i*n + j)(由零基计数提供).

事实上,这就是"二维"阵列的工作方式.例如,当你做一个常规的元素数组时 - T[][]如果你试图将它衰减成一个指针,它就会很简单T*.在引擎盖下,记忆是连续和线性布局的,没有形状,只有一条长街(就像计算机看到的那样).它只是通过使用第一段中的表达式(或类似的表达式)来推断行和列的概念.电脑不关心.

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

有一点需要注意的是,vectors会创建一个内部内存块,这个数组可能会超过实际数组的大小,因为弹出和推送新元素.此外,您最初没有义务定义它的大小,但可以通过push_back,push_front等轻松扩展它.这意味着其他东西可以随时改变并且扩展可能会花费你很多,即使使用移动语义.

偏离矢量的唯一原因是当你正在进行一些重型3D渲染或面向数据的模拟时,期望数据以一些非常自定义的特定方式打包,并且要手动改组,整洁vector可能不容易.但这将推动你进入更低级别的裸阵列领域(你应该为此做好准备).你应该从中得到的关键是你可以简单地将"心理二维数组"向量(实际上,数据没有真正的几何形状,这就是我们如何,微不足道的人,看到它)作为向量处理,并且只是对它们进行不同的索引.确保按顺序逐个输入所有行数据,你将得到一个非常简单的布局,可以用(i*n + j)简单地探测/索引,其中[i,j]是经典的2D矩阵下标/索引.

然后,它可以很简单:

vector<char> world(totalRows*totalColumns, ' ');
Run Code Online (Sandbox Code Playgroud)

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

你的代码应该可以工作,但是不必要的膨胀可能会在尝试操纵你的数据,转移它并编写不必要的东西时引入不必要的心理开销,远远低于实际使用i*n + j"手动索引"方法来保持你的心理状态一个二维阵列/字符的字符.如果您愿意,您甚至可以覆盖功能以添加语法糖.