2013-10-11 63 views
3

在C++ 11,有一個很好的方式來初始化陣列的矢量(我指的是C++類)與一種元件,像C++ - 初始化陣列的矢量與一個元件

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

到初始化所有1的向量的3x2向量?

不幸的是,數組向量的模擬似乎不起作用;我真的有義務使用for循環嗎?

回答

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}}); 

但我決定刪除第二對大括號。他們一直在那裏壓制叮咚++警告:通常,std::array包含一個(原始)數組。一對大括號足以初始化這個內部數組,但是因爲{1,1}(一對大括號)的元素用於初始化此內部數組的元素,所以clang ++會發出警告,而不是聚合(外部std::array)本身。答曰鐺++:

警告:建議圍繞子對象的初始化括號

我在標準看着此起來,它要求在[array.overview]/2

陣列是可以與語法

       被初始化的聚集體(8.5.1)初始化列表};

其中初始化列表是逗號分隔的高達N元件,其類型可轉換爲T的列表。

參數傳遞使用相同的規格作爲這種形式的初始化(稱爲複製初始化,[dcl.init]/15),因此使用一種對大括號被保證工作。

OTOH,沒有要求std::array包含(原始)數組。

+0

你的代碼工作出色,但現在我有幾個問題: – Pippo

+0

爲什麼我們應該使用兩個括號? – Pippo

+0

如果我初始化v作爲一個全局變量(在main之外),爲什麼這個方法不工作? – Pippo