多维向量概念C++

Multidimension vector concept C++

本文关键字:C++ 向量      更新时间:2023-10-16

我有一个巨大的三维向量,我在其中存储双值。为了提高性能,我想在处理之前预先保留元素的数量;然而,我真的不明白reserve&清除&在这种情况下擦除工作。

我已经实现了一个小程序,在这种情况下它有2d矢量,请参阅下面的代码片段:`

for(int counter = 0; counter < 2; counter++){
    cout << "Counter-> " << counter << endl;
    vector<vector<double> > vec2D;
    vec2D.reserve(2);
    // assign values to the vec
    for(int i = 0; i < 2; i++){
        vec2D[i].reserve(5);
        for(int j = 0; j < 5; j++){
            vec2D[i][j] = j;
        }
    }
    // print the vector content
    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 5; j++){
            cout << vec2D[i][j] << "t";
        }
        vec2D[i].clear();
        cout << endl;
    }
    vec2D.clear();
}

当我运行这个代码片段时,它只在for循环中迭代一次,而应该迭代两次;然而,当我在for循环之外声明向量时,它确实会迭代两次。上面片段的输出是:

Counter-> 0
0   1   2   3   4   
0   1   2   3   4   
Counter-> 1

你能说明一下在这种情况下它应该是什么样子以及它是如何工作的吗。

提前谢谢。

您的代码中有一个大问题:reserve()不更改向量的大小,只更改其存储容量(以避免将来的系统调用)。

在您的情况下,需要的不是reserve()而是assign()resize()

如果你想要任何外观上的性能,不要使用矢量的矢量:这是非常低效的。这可能是最有效的内存利用率,并且比矢量更快的访问,尽管有一些内存权衡的更快解决方案:

class GridWithSmallDimensions
{
    double * values;
    int sizeX, sizeY, sizeZ;
public:
    GridWithSmallDimensions(int x, int y, int z) 
    : sizeX(x), sizeY(y), sizeZ(z)
    {
        values = new double [x*y*z];
    }
    ~ GridWithSmallDimensions()
    {
        delete [] values;
    }
    double get(int x, int y, int z)
    {
        return value[x+sizeX*(y+sizeY*z)];
    }
    void set(int x, int y, int z, double v)
    {
        value[x+sizeX*(y+sizeY)] = v;
    }
};

这里有一个稍微复杂一点的实现,旨在减少指数计算:

class GridWithRowPointers
{
    int sizeX, sizeY, sizeZ; // Dimensions
    double * values; // Data
    double ** rows; // Pointers to "rows" of data indexed by x
    inline int getIndex(y, z) const // Get index of data within a row
    {
        return sizeZ * y + z;
    }
public:
    GridWithRowPointers(int x, int y, int z) 
    : sizeX(x), sizeY(y), sizeZ(z)
    {
        values = new double [x*y*z]; // Allocate data
        rows = new (double*) [x]; // Allocate row pointers
        for( int n = 0; n < sizeX; n++ )
        {
            rows[n] = values + sizeY * sizeZ;
        }
    }
    ~ GridWithRowPointers()
    {
        delete [] values;
        delete [] rows;
    }
    inline double get(int x, int y, int z) const
    {
        // Access value via row pointer
        return rows[ x ][ getIndex(y,z) ];
    }
    inline void set(int x, int y, int z, double v)
    {
        // Access value via row pointer
        rows[ x ][ getIndex(y,z) ] = v;
    }
};