【问题标题】:Convert int[n][n] to vector<vector<int>>将 int[n][n] 转换为 vector<vector<int>>
【发布时间】:2021-04-23 14:36:27
【问题描述】:

我们可以通过以下方式轻松地将数组转换为向量:

int a[n];

vector<int> b = vector(a, a + n);

我想使用矩阵,如果我想转换:

int a[n][n];

vector<vector<int>> b = ... // from a 

b.size() = n 和 b[0...n-1].size() = n ?


或者,我可以接受解决方案转换

std::vector< std::array<int, n> > a;
a.reserve(n);

vector<vector<int>> b = ... // from a

【问题讨论】:

  • 如果您的矩阵具有恒定长度,即始终为矩形,您可能不需要向量的灵活性。至少没有一个维度。
  • 关于a.reserve(n),您应该阅读Choice between vector::resize() and vector::reserve()reserve(n) 不会做任何有意义的事情,除非你也插入元素。
  • @Yunnosch 我同意这是一个有效的观点,但我确实需要它,因为我无法控制类型(需要返回一个向量>)。我使用 int [n][n] 为leetcode.com/problems/spiral-matrix-ii 创造了一个解决方案。因此我的问题。注意,相关:stackoverflow.com/questions/18991765/vector-of-vectors-reserve
  • 为什么不从一开始就使用向量(或std::array)?为什么需要“转换”为向量?
  • @TaiguaraTupinambás 我想保持简单,只有 std

标签: c++ arrays vector


【解决方案1】:

我怀疑向量的向量是您用例的容器的最佳选择,但如果它超出您的控制范围,这样的事情应该可以工作:

int a[n][n];
std::vector<std::vector<int>> v;
v.reserve(n);
for (int *arr : a) {
    v.emplace_back(arr, arr + n);
}

【讨论】:

  • 如果您发现此解决方案会给您带来性能问题,请注意 vectors 或 vectors 可能会非常慢。每个vector 是一个连续的内存块,但在这里你有n+1 vectors 并且必须在 RAM 中进行大量昂贵的跳跃来读取你想要的所有数据,而不是读取一个大块.通常最好制作一个大小为n*n 的大vector 并将其包装在一个类中,该类执行一些数学运算以将二维坐标映射到一个简单的一维索引。 Here's a simple example.
  • 它有点难用,所以除非你需要速度,否则不要使用它。
  • @user4581301 这个问题专门询问了向量的向量(并且 OP 在 cmets 中澄清了类型的选择超出了他们的控制范围)。我刚刚为这个问题提供了一个合理的解决方案。
  • @DanM。谢谢你和+1,我会在选择答案前一天给它,看看是否有人能想出一个没有任何循环的解决方案(不太可能,但我们永远不知道);)我最终直接声明了一个向量vector&lt;vector&lt;int&gt;&gt; a(n,vector&lt;int&gt;(n));@987654322 @
  • @AntoninGAVREL 您可以用std::for_each 替换循环,但这只是将它移动到库函数中。 std::vector&lt;std::vector&lt;int&gt;&gt; 并不比 vector&lt;T&gt; 更特别,所以它没有任何额外的方法/构造函数来处理多维的东西。
猜你喜欢
  • 2020-07-15
  • 2016-11-11
  • 2016-05-30
  • 2021-08-26
  • 2021-11-07
  • 1970-01-01
  • 2022-01-13
  • 2013-03-15
  • 2022-08-07
相关资源
最近更新 更多