C++ 3D 矢量保留"blocks"
C++ 3D vector preserving "blocks"
假设我需要不确定数量的 3×4 矩阵。(或任何其他固定的 m x n 维矩阵的序列。 我的第一个想法是将这些矩阵存储在一个std::vector
中,其中每个矩阵本身就是一个std::vector<std::vector<double> >
。 如何使用std::vector::reserve()
为这些矩阵中的数字(例如x
)预分配空间? 因为我知道其中两个维度,所以我应该(或者我希望)能够x
这些块的大小。
我知道如何在 1D std::vector
中实现这个对象,但我想知道如何在 3D std::vector
中做到这一点,如果没有其他原因,只是为了更好地学习如何使用 std::vector
类。
将矩阵存储为向量的向量可能效率很低,但如果必须这样做,那就去做吧。预留空间与往常相同:
typedef std::vector<std::vector<int>> matrix_type;
std::vector<matrix_type> collection;
collection.reserve(100); // set capacity for 100 "matrices"
// make 10 4x3-matrices; `collection` won't reallocate
collection.resize(10, matrix_type(4, std::vector<int>(3)));
对于您的基本类型,最好有一个m * n
元素的向量并大步访问它,即第 (i,j) 个元素将位于位置 i * n + j
。每个向量本身就是一个动态容器,您可能不希望到处都是那么多动态分配。
同样,上面的reserve
调用可能不会像你想象的那样,因为它只为内部向量的记账数据保留内存(通常每个向量三个单词,即 300 个单词),而不是实际数据。
有鉴于此,您甚至可能希望将std::array<int, m*n>
视为矩阵类型(并大步访问它);现在您实际上可以预先为实际矩阵保留空间 - 但是m
和n
现在必须是编译时常量。
更好的方法是提供一个类接口,并为整个矩阵使用单个线性内存块。然后,您可以通过不同的方式实现该接口,范围从适当大小的内部数组(如果大小是大小的一部分)std::vector<int>
或通过提供索引(pos = row*cols + col
)。
在std::vector< std::vector<int> >
方法中,外部向量将分配内存来存储内部向量,并且每个向量都将分配内存来保存自己的元素。使用原始指针,它在内存布局上类似于:
int **array = new int*[ N ];
for ( int i = 0; i < N; ++i )
array[i] = new int[ M ];
那是:
[ 0 ] -------> [ 0, 1, 2, ... ]
[---]
[ 1 ] -------> [ 0, 1, 2, ... ]
[ . ]
[ . ]
或者基本上是 N+1 个单独的内存块。
- 有根的二进制搜索树.保留与其父级的链接
- 为多个会话保留XPtr
- 保留对其他类的成员函数的引用
- 指针保留字符串
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 必须为 C++20 协程帧保留多少内存?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 局部变量保留函数中的值
- 保留函数指针模板参数
- 变量超出范围后如何保留向量值?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 即使在使用 delete[] 后仍保留的元素
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将成员函数保留为未定义
- C++ 3D 矢量保留"blocks"
- dos-code::blocks保留c++关键字以外的名称