可调整大小的动态二维数组的更好解决方案

时间:2016-02-15 00:50:36

标签: c++ c++11

嗨,我必须创建一个动态的二维向量。 作为二维,我认为最好不要使用boost.MultiArray来提高效率rasons(大于2维的句柄向量的开销)。 我的数据结构必须在运行时更改行维度,而列大小是固定的,即为2。

我想到这样的事情:

vector<vector<unsigned int> > grid;//declaration
vector<unsigned int> row(2);
grid.push_back(row);//copy vector row and insert in grid

我的问题是:  这是实现我意图的好方法吗?我认为这是低效的,昂贵的。当我调用push_back时会发生什么? 或者有一种更好的方式我忽略了? 而且,是否有可能在声明中指定内部向量的大小为2? (编译器是c ++ 11)

1 个答案:

答案 0 :(得分:0)

你绝对应该避免使用向量矢量 - 这会将数据分散到整个内存中。它不仅会占用超出您需要的内存,当您尝试使用数据时,还会遇到缓存局部性问题。

您只需要一个简单的数据类型,例如std::arraystd::pairstd::tuple e.g。

std::vector< std::array< int, 2 > > grid;
grid.push_back( { 5, 3 } );

至于调整向量的大小,这总是会发生。但是成本是摊销的线性时间(即它确实需要重新分配和复制,但随着规模呈指数级增长,这种情况会以指数方式减少)。

如果您实际知道您可能需要多少元素,则可以使用std::vector::reserve预先避免不必要的大小调整。