2012-01-28 48 views
2

以下代码适用于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/

+0

'int数组[10] = {0,1,2,0,0,0,0,0,0,9} ;' – 2012-01-28 21:41:58

+3

这是一个C99功能。 – 2012-01-28 21:42:01

+0

@Mehrdad Afshari“指定初始值设定项”。 – cnicutar 2012-01-28 21:42:39

回答

5

这种初始化形式仅在C99标准中定义。它确实不是适用于C++。所以,就必须分配您的元件一个接一个:

int array[10] = { 0 }; 
array[1] = 1; 
array[2] = 2; 
array[9] = 9; 
+1

你需要'= {0}'。 – 2012-01-28 21:48:36

+0

正确。更新。 – 2012-01-28 21:49:13

+0

这不是*初始化*。 -1 – 2012-01-28 22:11:32

3

尽管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; 
})(); 
+0

你可以看看我的提议非常类似的问题:http://stackoverflow.com/a/12839880/1463922。作为std :: array的一部分做这样的初始化会不会很有趣? – PiotrNycz 2012-10-11 12:50:39

+0

@PiotrNycz:这是一个有趣的想法。但是,不能将这样的构造函数添加到'std :: array'。 'std :: array'被指定为_aggregate_,这意味着它不能有任何用户声明的构造函数。其基本原理是允许集合初始化('T x [N] = {/ * initializers * /};'语法)。它可以移除聚合需求并添加对'initializer_list'的支持,但是这会破坏一些当前有效的C++ 11(和TR1)代码(例如依赖大括号的代码,我不相信这是有效的为初始化列表)。 – 2012-10-11 16:27:15

+0

我不是故意添加“用户声明的构造函数”,无论它是什么意思。我只是想添加构造函数,就像在C中一样,只允许初始化所选元素,就是这样。 C:'int [100] = {[55] = 7};',用我的数组:'CArray a {E [55] = 7};'。当然简单的初始化仍然是有效的:'CArray a {0,0,...,7};' – PiotrNycz 2012-10-11 16:35:41