在C++ 11,有一個很好的方式來初始化陣列的矢量(我指的是C++類)與一種元件,像C++ - 初始化陣列的矢量與一個元件
std::vector<std::vector<int> > foo(3, std::vector<int>(2, 1));
到初始化所有1的向量的3x2向量?
不幸的是,數組向量的模擬似乎不起作用;我真的有義務使用for循環嗎?
在C++ 11,有一個很好的方式來初始化陣列的矢量(我指的是C++類)與一種元件,像C++ - 初始化陣列的矢量與一個元件
std::vector<std::vector<int> > foo(3, std::vector<int>(2, 1));
到初始化所有1的向量的3x2向量?
不幸的是,數組向量的模擬似乎不起作用;我真的有義務使用for循環嗎?
也許這樣嗎?
#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
包含(原始)數組。
你的代碼工作出色,但現在我有幾個問題: – Pippo
爲什麼我們應該使用兩個括號? – Pippo
如果我初始化v作爲一個全局變量(在main之外),爲什麼這個方法不工作? – Pippo