thể trùng lặp:
Find position of element in C++11 range-based for loop?Python giống như vòng lặp liệt kê trong C++
Tôi có một vector
và tôi muốn lặp nó và, đồng thời, có thể truy cập các chỉ mục cho từng phần tử riêng lẻ (tôi cần chuyển cả phần tử và chỉ mục của nó đến một hàm). Tôi đã xem xét hai giải pháp sau:
std::vector<int> v = { 10, 20, 30 };
// Solution 1
for (std::vector<int>::size_type idx = 0; idx < v.size(); ++idx)
foo(v[idx], idx);
// Solution 2
for (auto it = v.begin(); it != v.end(); ++it)
foo(*it, it - v.begin());
Tôi đã tự hỏi liệu có thể có giải pháp nhỏ gọn hơn hay không. Một cái gì đó tương tự như của enumerate của Python. Đây là gần nhất mà tôi đã sử dụng vòng lặp C++ 11, nhưng phải xác định chỉ mục bên ngoài vòng lặp trong phạm vi riêng chắc chắn có vẻ giống như một giải pháp tồi tệ hơn 1 hoặc 2:
{
int idx = 0;
for (auto& elem : v)
foo(elem, idx++);
}
Có cách nào (có thể sử dụng Boost) để đơn giản hóa ví dụ mới nhất theo cách mà chỉ mục được tự chứa trong vòng lặp?
Tại sao đơn giản hóa những điều đơn giản? :-) – Kos
Bạn sẽ phải tạo một hàm/đối tượng giống như máy phát điện trả về std :: pair và sử dụng trường đầu tiên và thứ hai của cặp. Bạn có thể sử dụng macro để thực hiện thủ thuật, nhưng không có cách nào tiện dụng và thanh lịch để sử dụng cú pháp giống Python trong C++. Giải pháp thứ hai của bạn có lẽ là điều tốt nhất để làm. – Morwenn
@Kos Tôi khá ổn với giải pháp 2. Chỉ cần tò mò nếu thậm chí còn có một cách đơn giản hơn :) – betabandido