相关疑难解决方法(0)

初始化3D矢量的最有效方法是什么?

我在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)

c++ performance vector

7
推荐指数
2
解决办法
3万
查看次数

如何使用动态分配的任意维数组?

典型的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阵列的工作方式相同; 并且所有动态,动态大小可以传递给函数并从函数返回?

c arrays multidimensional-array

3
推荐指数
1
解决办法
374
查看次数

标签 统计

arrays ×1

c ×1

c++ ×1

multidimensional-array ×1

performance ×1

vector ×1