【问题标题】: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

【问题讨论】:

    标签: c++ matrix vector 2d


    【解决方案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...
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 2018-03-26
    • 2020-12-09
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多