【问题标题】:C++ - Initialise a vector of arrays with one elementC++ - 用一个元素初始化一个数组向量
【发布时间】:2013-10-19 13:17:46
【问题描述】:

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

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

初始化一个全为 1 的 3x2 向量?

不幸的是,数组向量的类比似乎不起作用;我真的必须使用 for 循环吗?

【问题讨论】:

    标签: arrays c++11 vector initialization


    【解决方案1】:

    可能是这样的?

    #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} 的元素(一对大括号)用于初始化这个内部数组的元素,而不是聚合(外部std::array ) 本身。 Quoth clang++:

    警告:建议在子对象初始化周围使用大括号

    我在标准中查找了这个,它要求在 [array.overview]/2

    数组是可以使用语法初始化的聚合 (8.5.1)

        array&lt;T, N&gt; a = { initializer-list };

    其中 initializer-list 是一个逗号分隔的列表,最多包含 N 元素,其类型可转换为 T

    参数传递使用与这种初始化形式相同的规范(称为copy-initialization,[dcl.init]/15),因此保证使用一对大括号 上班。

    OTOH,std::array 不要求包含(原始)数组。

    【讨论】:

    • 您的代码运行良好,但现在我有几个问题:
    • 为什么要使用两个括号?
    • 如果我将 v 初始化为全局变量(在 main 之外),为什么此方法不起作用?
    • 从什么时候开始使用 C++ 可以避免在主代码末尾出现“返回 0”? (我也忽略了它,令人惊讶的是它起作用了!o.O)
    • “如果我将 v 初始化为全局变量(在 main 之外),为什么这个方法不起作用?”我不知道?这个对我有用。请发布您所做的示例(例如,对您的问题进行编辑)。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多