以下代碼適用於GCC的C編譯器,但不適用於C++編譯器。是否有一個「捷徑」在C++中實現相同的結果?C++中單個元素的靜態數組初始化
int array[10] = {
[1] = 1,
[2] = 2,
[9] = 9
};
編輯: 姆,我發現這個,澄清一切。 http://eli.thegreenplace.net/2011/02/15/array-initialization-with-enum-indices-in-c-but-not-c/
以下代碼適用於GCC的C編譯器,但不適用於C++編譯器。是否有一個「捷徑」在C++中實現相同的結果?C++中單個元素的靜態數組初始化
int array[10] = {
[1] = 1,
[2] = 2,
[9] = 9
};
編輯: 姆,我發現這個,澄清一切。 http://eli.thegreenplace.net/2011/02/15/array-initialization-with-enum-indices-in-c-but-not-c/
這種初始化形式僅在C99標準中定義。它確實不是適用於C++。所以,就必須分配您的元件一個接一個:
int array[10] = { 0 };
array[1] = 1;
array[2] = 2;
array[9] = 9;
你需要'= {0}'。 – 2012-01-28 21:48:36
正確。更新。 – 2012-01-28 21:49:13
這不是*初始化*。 -1 – 2012-01-28 22:11:32
儘管gcc可能支持某種類型的C++擴展,但通常建議儘可能避免編譯器和平臺特定的擴展。
使用數組初始化的標準C++語法:
int array[10] = { 0, 1, 2, 0, 0, 0, 0, 0, 0, 9 };
或寫一個函數來做到的特定元素的初始化:
std::array<int, 10> create_initialized_array()
{
std::array<int, 10> values = { 0 };
values[1] = 1;
values[2] = 2;
values[9] = 9;
return values;
}
std::array<int, 10> array = create_initialized_array();
或者使用lambda表達式:
std::array<int, 10> array = ([]() -> std::array<int, 10>
{
std::array<int, 10> values = { 0 };
values[1] = 1;
values[2] = 2;
values[9] = 9;
return values;
})();
你可以看看我的提議非常類似的問題:http://stackoverflow.com/a/12839880/1463922。作爲std :: array的一部分做這樣的初始化會不會很有趣? – PiotrNycz 2012-10-11 12:50:39
@PiotrNycz:這是一個有趣的想法。但是,不能將這樣的構造函數添加到'std :: array'。 'std :: array'被指定爲_aggregate_,這意味着它不能有任何用戶聲明的構造函數。其基本原理是允許集合初始化('T x [N] = {/ * initializers * /};'語法)。它可以移除聚合需求並添加對'initializer_list'的支持,但是這會破壞一些當前有效的C++ 11(和TR1)代碼(例如依賴大括號的代碼,我不相信這是有效的爲初始化列表)。 – 2012-10-11 16:27:15
我不是故意添加「用戶聲明的構造函數」,無論它是什麼意思。我只是想添加構造函數,就像在C中一樣,只允許初始化所選元素,就是這樣。 C:'int [100] = {[55] = 7};',用我的數組:'CArray
'int數組[10] = {0,1,2,0,0,0,0,0,0,9} ;' – 2012-01-28 21:41:58
這是一個C99功能。 – 2012-01-28 21:42:01
@Mehrdad Afshari「指定初始值設定項」。 – cnicutar 2012-01-28 21:42:39