多维向量概念C ++

时间:2014-09-18 13:04:23

标签: c++ memory-management vector multidimensional-array

我有一个巨大的3D矢量,我存储了双值。为了提高性能,我希望在处理之前预先知道元素的数量;但是,在这种情况下,我无法确定如何保留和清除&擦除工作。

我已经实现了一个小程序,在这种情况下有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

请你明确说明在这种情况下它应该是怎样的以及它是如何工作的。

提前致谢。

2 个答案:

答案 0 :(得分:4)

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

您的案例需要reserve()assign()而不是resize()

答案 1 :(得分:1)

如果你想要任何表现,请不要使用矢量矢量:这非常低效。这可能是最有效的内存利用率,也是比向量更快的访问,尽管有更快的解决方案与一些内存权衡:

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;
    }
};
相关问题