2013-04-29 137 views
1

我想初始化一個鋸齒狀的數組。 爲什麼不這項工作:C++ 11迭代鋸齒陣列?

int *arr[10]; 
for (int *row : arr) 
    row = new int[10]; 

它運行但後來改編爲不可讀。

如何在這種情況下正確使用這種「for」形式?

否則,我該如何初始化X行的鋸齒狀數組,每行都是Y元素,並將其全部設置爲零?

+10

雖然它不能解釋爲什麼它不起作用,對於Finagle的緣故,只需使用'std :: vector'。 – 2013-04-29 11:40:27

+6

有太多的明星是C++。 – 2013-04-29 11:42:31

回答

6

嘗試:

int* arr[10]; 
for (int*& row : arr) 
    row = new int[10]; 

既然你改變了你需要遍歷引用而不是值(這是什麼數組中僅複製)的環內的數組中的值。這與函數調用語義非常相似。

+0

該死的!,我在做(int&* row:arr)來代替!應該考慮切換訂單......謝謝 – 2013-04-29 11:31:40

+4

不,你應該想到不使用原始指針和C風格的數組。 – 2013-04-29 11:42:54

+1

int&* row' IIRC是引用int的非法和無意義的指針。 – 2013-04-29 11:43:02

1
for(auto&row:arr)  // note the &. also note the auto 
    row = new int[10]; 

編譯器應該真的警告這個愚蠢的錯誤。多次發生在我身上。

0

由影片提供的答案是正確的,但正如其他人已經在評論中所述:如果你真的想學習C++ 11,你應該使用像容器std::vector

例如:

std::vector<std::vector<int>> list; 

大功告成。您可以隨意添加儘可能多的int。如果你想擁有動態INT-列表的固定大小的列表,可以考慮使用std::array

std::array<std::vector<int>, 10> arr; 

雖然我總是建議使用std::vector如果性能或內存是不是一個問題。你必須確保你沒有超過最大數量的元素。

關於for -loop,我總是嘗試用這種方式:

for (auto &item : list) 

如果你不想修改列表,添加const

for (const auto &item : list) 

即使你不想修改列表,你不通過它進行復制。

+0

'auto const&',因爲'const'最好放在右邊爲了一致性的緣故(它只能放在左邊的最外層,這非常令人困惑) – 2013-04-29 13:05:55

+0

如果我不在乎關於性能,我甚至不會使用C++。 – 2013-04-29 14:24:09

+0

@MatthieuM。我認爲這主要是一個品味問題,只會導致無盡的討論,關於什麼是對的,什麼是錯的。 – Excelcius 2013-04-29 14:31:21