【问题标题】:Better solution for a resizable and dynamic bidimensional array可调整大小和动态二维数组的更好解决方案
【发布时间】:2016-02-15 00:50:36
【问题描述】:

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

我是这样想的:

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)

【问题讨论】:

  • 我认为这取决于您的输入。您实际上可以将它视为一个调节器 2D 数组。所以,grid[0].push_back(1);也可以工作。
  • 如果大小是固定的,使用std::array
  • #AchmadJP 但是当大小超过容量时会发生什么?我觉得有些贵。我可以避免或限制它吗?
  • # T.C.即我应该做 vector grid ?
  • 容量实际上是安静的BIG,要检查它,你可以做cout 注意:要回复评论,请用@nick 标记此人 阅读来源:cplusplus.com/reference/vector/vector/max_size

标签: c++ c++11


【解决方案1】:

您绝对应该避免使用vector-of-vectors - 这会将您的数据分散到整个内存中。它不仅会占用比您需要的更多的内存,而且在您尝试使用数据时还会遇到缓存局部性问题。

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

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

至于调整向量的大小,这总是会发生的。但成本是摊销的线性时间(即它确实需要定期重新分配和复制,但随着大小呈指数增长,这种情况发生的频率会呈指数下降)。

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

【讨论】:

  • 谢谢。我试过这样看起来最简单: vector grid ;无符号整数 a[2];一个[0]=0;一个[1]=1; grid.push_back(a);但不要编译
  • 我发现我无法将数组存储在向量或任何其他容器中。要存储在容器中的元素的类型必须是可复制构造和可分配的。数组都不是。
  • 那么你最好的选择是std::pair 或者定义你自己的结构。
猜你喜欢
  • 2016-02-22
  • 1970-01-01
  • 2011-02-08
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
相关资源
最近更新 更多