【发布时间】:2020-12-30 12:33:47
【问题描述】:
我有一个一维向量
std::vector<int> vec1 = {4, 5, 6, 7};
我想将这些元素存储在二维向量中
std::vector<std::vector<int>> vec2;
但是 vec2 只能有高度 3,而我有 vec1 - 4 个元素。
vec2的输出应该是:
4 7
5
6
【问题讨论】:
我有一个一维向量
std::vector<int> vec1 = {4, 5, 6, 7};
我想将这些元素存储在二维向量中
std::vector<std::vector<int>> vec2;
但是 vec2 只能有高度 3,而我有 vec1 - 4 个元素。
vec2的输出应该是:
4 7
5
6
【问题讨论】:
也许我没有完全理解这个问题,但我理解的可以通过1个简单的for循环来实现。请注意,我们只有 3 行。
没什么好解释的。 . .
请看:
#include <iostream>
#include <vector>
int main() {
// 1d vector with any number of values
std::vector<int> vec1 = { 4, 5, 6, 7 };
//2d vector with 3 rows
std::vector<std::vector<int>> vec2(3);
// Take all elements from vec1 and copy them to vec2, columns first
for (size_t i{}; i < vec1.size(); ++i)
vec2[i % 3].push_back(vec1[i]);
// Output
for (const auto& v : vec2) {
for (const auto& i : v) std::cout << i << "\t";
std::cout << '\n';
}
return 0;
}
我想为vec2[i % 3].push_back(vec1[i]);添加一个解释-
您可以以某种方式认为二维std::vector 由行和列组成。并且一行再次包含一个std::vector,其中包含列值。
所以,如果我想使用第 0 行,那么我会写 vec[0]。如果我想为第0行添加列值,那么我可以写vec[0].push_back()。
对于第 1 行和第 2 行,类似的方法适用。并且由于我们要分配索引为 0,1,2,3,4,5,6,7 的“vec1”中的所有值。 . .到数字为 0,1,2,0,1,2,0,1,2,0,1,2 的行。 . .我们需要根据“vec1”的索引计算行号。这可以通过模除法轻松完成%
所以:
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
4 % 3 = 1
5 % 3 = 2
6 % 3 = 0
7 % 3 = 1
. . .
就是这样。
【讨论】:
i%3 在将i 与 3 潜水后给您余数。在第一次迭代中,i = 0,这意味着表达式是 0 % 3,即 0。第二次迭代,@ 987654332@ 是 1。第三次迭代 2 % 3 是 2。然后 i 重置为 0 并继续为 0、1、2、0、1、2...