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:
ia
là 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 ia
theo '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 ia
cá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:
pl
bằng {1,2,3,4}
- Một mảng
- Vòng lặp thứ hai:
pl
bằng {5,6,7,8}
- Một mảng
- Vòng lặp thứ ba:
pl
bằ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
n
là số được đề cập, thì ia[n]
giống như *(ia+n)
(Chúng tôi đang tham khảo địa chỉ của n
mục nhập chuyển tiếp), và ia+n
giố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 n
bằng với số lần lặp hiện tại bắt đầu từ 0. Vì vậy, pl
là 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+n
là í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 auto
từ 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 for
vò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.