我想初始化一個鋸齒狀的數組。 爲什麼不這項工作:C++ 11迭代鋸齒陣列?
int *arr[10];
for (int *row : arr)
row = new int[10];
它運行但後來改編爲不可讀。
如何在這種情況下正確使用這種「for」形式?
否則,我該如何初始化X行的鋸齒狀數組,每行都是Y元素,並將其全部設置爲零?
我想初始化一個鋸齒狀的數組。 爲什麼不這項工作:C++ 11迭代鋸齒陣列?
int *arr[10];
for (int *row : arr)
row = new int[10];
它運行但後來改編爲不可讀。
如何在這種情況下正確使用這種「for」形式?
否則,我該如何初始化X行的鋸齒狀數組,每行都是Y元素,並將其全部設置爲零?
嘗試:
int* arr[10];
for (int*& row : arr)
row = new int[10];
既然你改變了你需要遍歷引用而不是值(這是什麼數組中僅複製)的環內的數組中的值。這與函數調用語義非常相似。
該死的!,我在做(int&* row:arr)來代替!應該考慮切換訂單......謝謝 – 2013-04-29 11:31:40
不,你應該想到不使用原始指針和C風格的數組。 – 2013-04-29 11:42:54
int&* row' IIRC是引用int的非法和無意義的指針。 – 2013-04-29 11:43:02
for(auto&row:arr) // note the &. also note the auto
row = new int[10];
編譯器應該真的警告這個愚蠢的錯誤。多次發生在我身上。
由影片提供的答案是正確的,但正如其他人已經在評論中所述:如果你真的想學習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)
即使你不想修改列表,你不通過它進行復制。
'auto const&',因爲'const'最好放在右邊爲了一致性的緣故(它只能放在左邊的最外層,這非常令人困惑) – 2013-04-29 13:05:55
如果我不在乎關於性能,我甚至不會使用C++。 – 2013-04-29 14:24:09
@MatthieuM。我認爲這主要是一個品味問題,只會導致無盡的討論,關於什麼是對的,什麼是錯的。 – Excelcius 2013-04-29 14:31:21
雖然它不能解釋爲什麼它不起作用,對於Finagle的緣故,只需使用'std :: vector'。 – 2013-04-29 11:40:27
有太多的明星是C++。 – 2013-04-29 11:42:31