贡献者: addis
容器指的就是像 std::vector
这样的可以储存多个元素的对象,下面介绍的矢量,矩阵,高维数组等都是容器。
C/C++ 的数组是储存于内存的 stack(栈)中的,而 stack 一般只有几个 Mb,一旦数组太大就会产生 stack overflow 错误。第二是 stack 中的数据的大小都只能在编译时确定(即 constant expression,例如 literal 或者宏定义),所以我们不能在运行是确定数组的长度(例如从文件中读取,或通过运行时的计算得到)。
所以在一般来说容器都会 allocate(分配)到内存的 heap(堆)中。在 C++ 中,在 heap 中分配内存用 new
,释放则用 delete
。
std::vector
可以说是使用最广的矢量容器,理论上我们可以用 vector
的 vector
定义一个 heap 中的矩阵。
new
,数据在内存中不一定是连续的,甚至不一定按 i
的顺序排列。这样不是很好,为了性能和语法上的考虑,一般需要给每个容器分配一块连续的内存(例如我们会想要用单个连续索引来获得矩阵元)。
最后一种方法就是小时百科的 SLISC 库中的底层实现方法,即在堆中分配一段连续的内存,并把双索引转换乘单索引来获取矩阵元。
前面两个例子中双索引都是行主序的,即第二个索引增加 1,内存地址也增加 1。而这个例子中我们既可以使用行主序也可以使用列主序(第一个索引增加 1,内存地址增加 1),还可以使用单索引。可见这种方式要灵活得多。
注意这只是一个底层的原理,我们需要把这个功能封装到一个矩阵类 Mat
中,在使用的时候可以达到例如以下效果
CmatDoub
是列主序矩阵,MatDoub
是行主序矩阵。
我们来看一个简化版的 CmatDoub
定义,不考虑使用 const CmatDoub
。
友情链接: 超理论坛 | ©小时科技 保留一切权利