【问题标题】:initializing a two dimensional vector from a 2 dimensional array in C++从 C++ 中的二维数组初始化二维向量
【发布时间】:2021-10-02 15:35:45
【问题描述】:

我有这个代码:

int a[4][4]=
{
   {1,2,3,4},
   {5,6,7,8},
   {9,10,11,12},
   {13,14,15,16}
}

我想初始化定义如下的 B:

vector<vector<int>> b;

我知道我可以用两个循环来做到这一点(也可能用一个循环,如此处所述:https://stackoverflow.com/a/4092996/654019

但是有什么方法可以让我在没有任何循环的情况下做到这一点?

【问题讨论】:

  • 你可以用递归来做,这样可以避免任何循环。虽然它比使用循环效率低。
  • 我不确定您具体在寻找什么。我尝试在没有(可见)循环的情况下做到这一点:demo on coliru
  • 数据需要从数组复制到vector,所以不管你写不写,都会有循环、递归或展开循环在某处完成工作。建议:您可以通过将vectors 的vector 替换为单个vector that LOOKS like it's 2D 来简化工作。对于小型矩阵,这通常使用起来要快得多,因为所有数据都在一个易于缓存的块中。
  • 这里是如何在没有循环的情况下初始化 bauto b = vector&lt;vector&lt;int&gt;&gt;{ { a[0][0], a[0][1], a[0][2], a[0][3] }, { a[1][0], a[1][1], a[1][2], a[1][3] }, { a[2][0], a[2][1], a[2][2], a[2][3] }, { a[3][0], a[3][1], a[3][2], a[3][3] }, };
  • @Eljay 这比使用循环快吗?

标签: c++ arrays vector stl


【解决方案1】:

如果您只是想避免编写循环并让算法为您完成,您可以使用for_eachhttps://godbolt.org/z/jxT8vfhPr

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    int a[4][4] = {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,16}
    };
    std::vector<std::vector<int>> b;

    std::for_each(a, a + 4, [&b](auto v){
        b.push_back(std::vector<int>(v, v + 4));
    });

    std::for_each(cbegin(b), cend(b), [&b](auto v) {
        std::copy(cbegin(v), cend(v), std::ostream_iterator<int>(std::cout, " "));
        std::cout << "\n";
    });
}

【讨论】:

    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2011-12-13
    • 2012-05-20
    相关资源
    最近更新 更多