Làm thế nào để dựa trên phạm vi hoạt động cho các mảng đơn giản?
Điều đó có nghĩa là, " Hãy cho tôi biết một ranged-for làm gì (với mảng)? "
Tôi sẽ trả lời giả sử rằng - Lấy ví dụ sau bằng cách sử dụng các mảng lồng nhau:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Phiên bản văn bản:
ialà một mảng các mảng ("mảng lồng nhau"), chứa [3]các mảng, với mỗi [4]giá trị chứa . Ví dụ trên lặp lại iatheo 'phạm vi' ( [3]) chính của nó và do đó lặp lại [3]thời gian. Mỗi vòng lặp tạo ra một trong iacác [3]giá trị chính bắt đầu từ giá trị đầu tiên và kết thúc bằng [4]giá trị cuối cùng - Một mảng chứa các giá trị.
- Vòng lặp đầu tiên:
plbằng {1,2,3,4}- Một mảng
- Vòng lặp thứ hai:
plbằng {5,6,7,8}- Một mảng
- Vòng lặp thứ ba:
plbằng {9,10,11,12}- Một mảng
Trước khi chúng tôi giải thích quy trình, đây là một số lời nhắc thân thiện về mảng:
- Mảng được hiểu là con trỏ đến giá trị đầu tiên của chúng - Sử dụng mảng mà không có bất kỳ lần lặp nào trả về địa chỉ của giá trị đầu tiên
pl phải là một tham chiếu vì chúng tôi không thể sao chép các mảng
- Với mảng, khi bạn thêm một số vào chính đối tượng mảng, nó sẽ tiến lên nhiều lần và 'trỏ' tới mục nhập tương đương - Nếu
nlà số được đề cập, thì ia[n]giống như *(ia+n)(Chúng tôi đang tham khảo địa chỉ của nmục nhập chuyển tiếp), và ia+ngiống như &ia[n](Chúng tôi đang lấy địa chỉ của mục nhập đó trong mảng).
Đây là những gì đang xảy ra:
- Trên mỗi vòng lặp,
plđược thiết lập như một tài liệu tham khảo để ia[n], với nbằng với số lần lặp hiện tại bắt đầu từ 0. Vì vậy, pllà ia[0]trên vòng đầu tiên, ngày thứ hai nó ia[1], và vân vân. Nó lấy giá trị thông qua lặp lại.
- Vòng lặp cứ kéo dài như vậy
ia+nlà ít hơn end(ia).
... Và đó là về nó.
Nó thực sự chỉ là một cách đơn giản để viết điều này :
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
Nếu mảng của bạn không được lồng vào nhau, thì quá trình này sẽ trở nên đơn giản hơn một chút vì không cần tham chiếu , bởi vì giá trị được lặp lại không phải là một mảng mà là giá trị 'bình thường':
int ib[3] = {1,2,3};
for (auto pl : ib)
cout << pl;
for (int n = 0; n != 3; ++n)
cout << ib[n];
Một số thông tin bổ sung
Điều gì sẽ xảy ra nếu chúng tôi không muốn sử dụng autotừ khóa khi tạo pl? Nó sẽ trông như thế nào?
Trong ví dụ sau, plđề cập đến một array of four integers. Trên mỗi vòng lặp plđược cung cấp giá trị ia[n]:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
Và ... Đó là cách nó hoạt động, với thông tin bổ sung để loại bỏ mọi nhầm lẫn. Nó chỉ là một forvòng lặp 'tốc ký' tự động tính cho bạn, nhưng thiếu cách để lấy lại vòng lặp hiện tại mà không cần thực hiện thủ công.
for. Nhưng thời điểm mảng đó phân rã thành một con trỏ, thông tin về kích thước sẽ bị mất.