我在C++中有一个3D字符串向量:
vector<vector<vector<string>>> some_vector
Run Code Online (Sandbox Code Playgroud)
我正在尝试的是找到一种快速的方法来为它分配内存.
我试着用两种不同的方法来定义它,如下所示:
#include<vector>
#include<iostream>
#include<ctime>
using namespace std;
#define DIM1 100
#define DIM2 9
#define DIM3 120
int main()
{
clock_t t1_start = clock();
vector<vector<vector<string>>> vec1(DIM1, vector<vector<string>>(DIM2, vector<string>(DIM3)));
clock_t t1_end = clock();
double diff1 = (t1_end - t1_start) / double(CLOCKS_PER_SEC);
clock_t t2_start = clock();
vector<vector<vector<string>>> vec2;
vec2.resize(DIM1);
for(int i = 0; i < DIM1; i++)
{
vec2[i].resize(DIM2);
for(int j = 0; j < DIM2; j++)
vec2[i][j].resize(DIM3);
}
clock_t t2_end = clock();
double diff2 = (t2_end - t2_start) …Run Code Online (Sandbox Code Playgroud) 典型的1-D数组可以在声明中静态或自动分配.
enum { n=100 };
int arr1[n];
Run Code Online (Sandbox Code Playgroud)
或者通过指针动态分配和访问.
int *arr1m=malloc(n*sizeof*arr1m);
int *arr1c=calloc(n, sizeof*arr1c);
Run Code Online (Sandbox Code Playgroud)
这两种样式都使用相同的语法访问元素.
int i = n/2;
arr1[i] = arr1c[i] = arr1m[i] = 42;
Run Code Online (Sandbox Code Playgroud)
但是当你添加第二个维度时,需要花费一些力气来实现相同的语法.
int arr2[n][n];
int *arr2c=calloc(n*n,sizeof*arr2c);
arr2[5][5] = arr2c[5*n+5] = 23;
Run Code Online (Sandbox Code Playgroud)
如果您将其构造为Iliffe向量,则只能获得双重括号.
int **arr2l=calloc(n,sizeof*arr2l);
for (int j=0; j<n; j++)
arr2l[j]=calloc(n,sizeof**arr2l);
arr2[6][6] = arr2l[6][6] = 72;
Run Code Online (Sandbox Code Playgroud)
但随着尺寸的增加,这变得越来越麻烦.
另一个困难是在访问元素之前检查动态数组的边界(这样您就不会触及未正确分配的内存).在真正的阵列可以使用sizeof运营商确定的界限,但这些动态数组携带它们的大小与他们.
如何定义具有快速,连续布局的结构,如数组,但具有一致的语法,用于访问具有索引列表的元素,这些索引对于2D阵列和3D阵列的工作方式相同; 并且所有动态,动态大小可以传递给函数并从函数返回?