在C++11中使用初始化列表初始化2D向量

13
我如何使用初始化列表初始化一个二维向量? 对于普通向量,可以这样做:
vector<int> myvect {1,2,3,4};

足以。但对于一个二维的,需要执行:

vector<vector<int>> myvect{ {10,20,30,40},
                            {50,60,70,80}
                          };

如何正确地完成它?
我该如何使用for循环来迭代它?

for(auto x: myvect)
{
    cout<<x[j++]<<endl;
}

这只是展示:10,1!

顺便问一下,这是什么意思?

   vector<int> myvect[5] {1,2,3,4};
我看到它在这里,但是不理解!链接

1
据我所知,第一个问题的答案在array(POD)和vector(非POD)之间是不同的。而且,OP中的第二个和第三个问题也没有在那个答案中涉及到。 - dyp
1个回答

16

什么是正确的做法?

您展示的方法是一种可能的方式。您也可以使用:

vector<vector<int>> myvect = { {10,20,30,40},
                               {50,60,70,80} };

vector<vector<int>> myvect{ vector<int>{10,20,30,40},
                            vector<int>{50,60,70,80} };

第一个构造函数创建了一个std::initializer_list<std::vector<int>>,其中的元素直接从内部花括号初始化列表中初始化。第二个构造函数显式地构造了临时向量,然后将其移动到std::initializer_list<std::vector<int>>中。这可能不会有任何区别,因为该移动可以被省略。

无论如何,在std::initializer_list<std::vector<int>>的元素被复制回到myvect中(不能从std::initializer_list中移出)。


我该如何使用for循环遍历它?

您实际上有一个向量的向量,因此您需要两个循环:

for(vector<int> const& innerVec : myvect)
{
    for(int element : innerVec)
    {
        cout << element << ',';
    }
    cout << endl;
}

为了明确展示结果类型,我避免使用auto


顺便问一下,这是什么意思?

这可能是一个打字错误。按照现在的写法,它是非法的。声明vector<int> myvect[5];声明了一个包含5个vector<int>的数组。因此,以下列表初始化需要初始化数组,但是该列表的元素不能隐式转换为vector<int>(存在一个接受size_t的构造函数,但它是显式的)。

这已经在那一页的评论中指出。

我猜作者想要写std::vector<int> vArray = {3, 2, 7, 5, 8};


非常感谢 :) 这真的很有帮助,特别是你使用了显式类型而不是自动类型,这使得事情变得更加清晰 :) - Hossein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接