Thông thường, các trình vòng lặp được sử dụng để truy cập các phần tử của một vùng chứa theo kiểu tuyến tính; tuy nhiên, với "vòng lặp truy cập ngẫu nhiên", có thể truy cập bất kỳ phần tử nào theo cùng một kiểu như operator[]
.
Để truy cập các phần tử tùy ý trong một vectơ vec
, bạn có thể sử dụng như sau:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
Sau đây là ví dụ về mẫu truy cập điển hình (các phiên bản C ++ trước đây):
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Lợi thế của việc sử dụng trình lặp là bạn có thể áp dụng cùng một mẫu với các vùng chứa khác :
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
Vì lý do này, thực sự dễ dàng tạo mã mẫu hoạt động giống nhau bất kể loại vùng chứa là gì . Một ưu điểm khác của trình vòng lặp là nó không cho rằng dữ liệu nằm trong bộ nhớ; ví dụ: người ta có thể tạo một trình lặp chuyển tiếp có thể đọc dữ liệu từ luồng đầu vào hoặc đơn giản là tạo dữ liệu một cách nhanh chóng (ví dụ: một bộ tạo phạm vi hoặc số ngẫu nhiên).
Một tùy chọn khác bằng cách sử dụng std::for_each
và lambdas:
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
Vì C ++ 11, bạn có thể sử dụng auto
để tránh chỉ định tên kiểu rất dài, phức tạp của trình lặp như đã thấy trước đây (hoặc thậm chí phức tạp hơn):
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Ngoài ra, có một biến thể đơn giản hơn cho mỗi biến thể:
sum = 0;
for (auto value : vec) {
sum += value;
}
Và cuối cùng cũng có std::accumulate
nơi bạn phải cẩn thận xem bạn đang thêm số nguyên hay dấu phẩy động.