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

Cha*_*ame 7 c++ performance vector

我在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) / double(CLOCKS_PER_SEC);

    cout<<"1st definition used time: "<<diff1<<"s"<<endl;
    cout<<"2nd definition used time: "<<diff2<<"s"<<endl;
}
Run Code Online (Sandbox Code Playgroud)

我希望第一种方法(vec1)可能比第二种方法(vec2)更快.

但事实证明,第一种方法比第二种方法慢得多.在我的机器上,第一种方法使用0.245秒,而第二种方法使用0.152秒.

此外,当我将数据类型切换为int时,第一个采用0.058秒,第二个采用0.004.

我可以知道是什么原因引起这种差异 是否有更好的方法为3D矢量分配内存?

提前谢谢了.

Mik*_*our 13

我可以知道是什么原因引起这种差异

第一个版本通过复制1-d向量构建2-d向量,然后通过复制它来构造3-d向量.这可能比没有复制时调整矢量大小要慢.但是,如果您正在构建优化,我希望差异可以忽略不计.

是否有更好的方法为3D矢量分配内存?

使用单个连续数组可能会更好,它包含在提供多维访问器的类中.这将使分配更加简单,并且在访问元素时也会避免某些指针解除引用(以一些算术为代价).像这样的东西:

template <typename T>
class vector3d {
public:
    vector3d(size_t d1=0, size_t d2=0, size_t d3=0, T const & t=T()) :
        d1(d1), d2(d2), d3(d3), data(d1*d2*d3, t)
    {}

    T & operator()(size_t i, size_t j, size_t k) {
        return data[i*d2*d3 + j*d3 + k];
    }

    T const & operator()(size_t i, size_t j, size_t k) const {
        return data[i*d2*d3 + j*d3 + k];
    }

private:
    size_t d1,d2,d3;
    std::vector<T> data;
};
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 4

我想我会通过分配一大块内存而不是很多小内存来优化它。这只是 2D 而不是 3D,但给出了基本思想:

template <class T>
class matrix { 
    size_t columns_;
    std::vector<T> data;
public:
    matrix(size_t columns, size_t rows) : columns_(columns), data(columns*rows) {}

    T &operator()(size_t column, size_t row) { return data[row*columns_+column]; }
};
Run Code Online (Sandbox Code Playgroud)

对于 3D,您需要处理“平面”(或其他东西)以及行和列,但基本思想几乎相同。