2d矢量初始化

时间:2012-06-24 18:34:49

标签: c++ vector

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

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

2 个答案:

答案 0 :(得分:9)

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

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

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

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

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

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

然后,它可以很简单:

vector

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

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

答案 1 :(得分:4)

您的代码有效。正如评论中所注意到的,vector<vector<T>>并不是真正的2D数组。

重要的是(totalRows, vector<char>(totalColumns, ' '))(totalColumns, vector<char>(totalRows, ' '))是等效的,只要您始终遵循用于创建向量的规则:line x column(或column x line