2013-05-17 41 views
6

Phạm vi C++ 11 dựa trên vòng lặp dereferences bộ lặp. Điều đó có nghĩa là nó không có ý nghĩa để sử dụng nó với boost::adaptor::indexed? Ví dụ:Phạm vi dựa trên vòng lặp với tăng :: adapter :: được lập chỉ mục

boost::counting_range numbers(10,20); 
for(auto i : numbers | indexed(0)) { 
    cout << "number = " i 
    /* << " | index = " << i.index() */ // i is an integer! 
    << "\n"; 
} 

Tôi luôn có thể sử dụng bộ đếm nhưng tôi thích các trình vòng lặp được lập chỉ mục.

  • Có thể sử dụng chúng bằng cách nào đó với phạm vi dựa trên vòng lặp không?
  • Thành ngữ để sử dụng các vòng dựa trên dải ô có chỉ mục là gì? (chỉ là một bộ đếm đơn giản?)
+1

'indexed' hút vì nó thêm' index() 'phương pháp để các * iterator *, không phải là giá trị trả về từ dereferencing iterator. :/ – Xeo

+1

@Xeo Thật vậy. Mỗi bây giờ và sau đó tôi cần chỉ số của phần tử trong phạm vi. Đầu tiên tôi cảm thấy xấu về nó. Sau đó, tôi giới thiệu một quầy. Nếu container có thể dễ dàng truy cập với một vòng lặp đơn giản cũ, tôi cảm thấy xấu một lần nữa và viết lại vòng lặp dựa trên phạm vi vào một vòng lặp cũ đơn giản. – gnzlbg

+2

vì Xeo đề cập đến việc tăng chỉ mục không tốt cho việc này. Nếu bạn không nhớ chuyển đổi thư viện có một vài thư viện phạm vi C++ dựa trên itertools của python, chẳng hạn như: https://github.com/ryanhaining/cppitertools/ – Cechner

Trả lời

2

Điều này đã được khắc phục trong Boost 1.56 (phát hành tháng 8 năm 2014); phần tử được xác định sau một số value_type với index()value() chức năng thành viên.

Ví dụ: http://coliru.stacked-crooked.com/a/e95bdff0a9d371ea

auto numbers = boost::counting_range(10, 20); 
for (auto i : numbers | boost::adaptors::indexed()) 
    std::cout << "number = " << i.value() 
     << " | index = " << i.index() << "\n"; 
0

Câu trả lời ngắn (như mọi người trong các nhận xét được đề cập) là "đúng, nó không có ý nghĩa." Tôi cũng thấy điều này gây phiền nhiễu. Tùy theo phong cách lập trình của bạn, bạn có thể muốn gói "zipfor" tôi đã viết (chỉ cần một tiêu đề): from github

Nó cho phép cú pháp như

std::vector v; 
zipfor(x,i eachin v, icounter) { 
    // use x as deferenced element of x 
    // and i as index 
} 

Thật không may, tôi không thể hình dung một cách để sử dụng dao động dựa trên cho cú pháp và phải nghỉ mát để các "zipfor" vĩ mô :(

Phần header được thiết kế cho những thứ như

std::vector v,w; 
zipfor(x,y eachin v,w) { 
    // x is element of v 
    // y is element of w (both iterated in parallel) 
} 

std::map m; 
mapfor(k,v eachin m) 
    // k is key and v is value of pair in m 

Thử nghiệm của tôi trên g ++ 4.8 với tối ưu hóa đầy đủ cho thấy mã kết quả không chậm hơn viết bằng tay.

Các vấn đề liên quan