C ++ - 使用一个元素初始化数组向量

时间:2013-10-11 12:44:27

标签: arrays c++11 vector initialization

在C ++ 11中,有一种很好的方法来初始化一个数组向量(我的意思是C ++类),它有一个元素,比如

std::vector<std::vector<int> > foo(3, std::vector<int>(2, 1));

用全1来初始化3x2向量的载体?

不幸的是,数组矢量的模拟似乎不起作用;我真的有义务使用for循环吗?

1 个答案:

答案 0 :(得分:5)

也许是这样的?

#include <vector>
#include <array>
#include <iostream>

int main()
{
    std::vector< std::array<int, 2> > v(3, {1,1});

    for(auto const& e0 : v)
    {
        for(auto const& e1 : e0)
            std::cout << e1 << ", ";
        std::cout << "\n";
    }
}

输出:

1, 1, 
1, 1, 
1, 1,

“我们为什么要使用两个括号?”

我的问题中的原始代码是

std::vector< std::array<int, 2> > v(3, {{1,1}});

但我决定删除第二对牙套。他们一直在那里压制clang ++警告:通常,std::array包含一个(原始)数组。一对大括号足以初始化这个内部数组,但clang ++会发出警告,因为{1,1}(一对大括号)的元素用于初始化此内部数组的元素,而不是聚合(外部{ {1}})本身。 Quoth clang ++:

  

警告:建议围绕子对象初始化

我在标准中看了这个,它需要在[array.overview] / 2

  

数组是可以使用语法

初始化的聚合(8.5.1)      

std::array 初始化列表 array<T, N> a = {

     

其中初始化列表是逗号分隔的最多};元素列表,其类型可转换为N

参数传递使用与此初始化形式相同的规范(称为复制初始化,[dcl.init] / 15),因此使用一对大括号保证工作。

OTOH,并不要求T包含(原始)数组。