2012-11-26 87 views
8

我之前(嵌入的東西)使用C,我可以初始化我的陣列那樣:c + +在初始化指定數組索引,如C

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 }; 

即我可以內部初始化指定索引。 目前我正在學習Qt/C++,我不相信這在C++中不被支持。

我有這個選項:-std=gnu++0x,但無論如何它不被支持。 (我不知道它是否支持C++ 11,因爲Qt與gcc 4.7.x一起工作)

那麼,它真的不被C++支持嗎?或者也許有辦法啓用它?

UPD:目前我想初始化const數組,因此std::fill將不起作用。

+1

「或者也許有辦法啓用它? - 使用C? (:D)好問題,+1。 – 2012-11-26 10:30:46

+3

您的代碼既不是C(包括C11)。 C11不支持這種初始化範圍('[a ... b] = 1'),只有單個元素('[a] = 1')。 – ybungalobill

+0

嗯......你可以使用'extern「C」{................}'在聲明周圍嗎?但我相信這個語法是嵌入式編譯器的補充。 – anishsane

回答

1

經過多年,我只是偶然地測試過,我可以確認它在g++ -std=c++11中工作,g ++版本是4.8.2。

7

HM,你應該使用std :: fill_n()該任務...

這裏說http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html指定inits(extention)沒有在GNU C++

編輯實現:從這裏取:initialize a const array in a class initializer in C++

作爲註釋說,你可以使用std:vector來獲得所需的結果。您仍然可以通過另一種方式強制執行const並使用fill_n。

int* a = new int[N]; 
// fill a 

class C { 
    const std::vector<int> v; 
public: 
    C():v(a, a+N) {} 
}; 
+0

謝謝你的答案。實際上,我需要初始化const數組,所以'std :: fill_n()'不適用於我。 –

+1

@DmitryFrank:使用'std :: vector',編寫一個函數,使用'fill_n'初始化矢量並返回結果。使用這個函數來初始化一個'const vector'。 – ybungalobill

+1

您還需要'刪除一個;'。填充數組的兩個動態分配,是不是過度殺傷? – iammilind

2

不,這樣做不可能在C++中這樣做。但是你可以用std::fill算法來分配值:

int widths[101]; 
fill(widths, widths+10, 1); 
fill(widths+10, widths+100, 2); 
fill(widths+100, widths+101, 3); 

這是不優雅,但它的作品。