如何在不知道宽度的情况下将元素存储在二维向量中?

Posted

技术标签:

【中文标题】如何在不知道宽度的情况下将元素存储在二维向量中?【英文标题】:How to store elements in 2d vector without knowing his width? 【发布时间】: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

【问题讨论】:

【参考方案1】:

也许我没有完全理解这个问题,但我理解的可以通过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
. . .

就是这样。

【讨论】:

你能解释一下带有 vec2[i % 3] 的 for 循环是如何工作的吗? @malicization i%3 在将i 与 3 潜水后给您余数。在第一次迭代中,i = 0,这意味着表达式是 0 % 3,即 0。第二次迭代,@ 987654332@ 是 1。第三次迭代 2 % 3 是 2。然后 i 重置为 0 并继续为 0、1、2、0、1、2...

以上是关于如何在不知道宽度的情况下将元素存储在二维向量中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道其宽度的情况下将 ul li 列表居中? (分页)

如何在不使用向量的情况下将数组传递给函数?

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

你知道如何在不改变其他元素顺序的情况下将元素移动到第一个位置吗?

如何在不导致复制的情况下将 char 数据附加到 std::vector

如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]