我有一个巨大的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
请你明确说明在这种情况下它应该是怎样的以及它是如何工作的。
提前致谢。
答案 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;
}
};