2016-08-09 17 views
5

Tôi cần một trình vòng lặp cho lớp thu thập truy cập ngẫu nhiên tùy chỉnh của mình. Tôi muốn sử dụng trình lặp với std::sort. Vì tôi là một người mới sử dụng C++ với ngân sách giới hạn thời gian, tôi muốn tránh viết toàn bộ bản thân mình.Tại sao const count_iterator của boost?

Trình vòng lặp của tôi về cơ bản chỉ đơn giản là size_t. Do đó, tôi nghĩ rằng boost::counting_iterator có thể là một kết quả phù hợp. Khi tôi đã hoàn thành Incrementable tôi phải nhận ra rằng counting_iterator xác định loại tham chiếu của nó là const Incrementable&.

Mặc dù tôi vẫn còn bị nhầm lẫn bởi rất nhiều C++, tôi tin rằng điều này sẽ ngăn không cho tôi sử dụng trình lặp với std::sort vì trình lặp const không thể được sử dụng để trao đổi các phần tử thu thập.

Đây là câu hỏi: tại sao boost::counting_iterator xác định loại tham chiếu của nó là const và, có lẽ quan trọng hơn, tôi nên sử dụng thay thế nào?

+1

'boost :: counting_iterator' không thể sử dụng để truy cập vùng chứa. Nó được tạo ra để "truy cập" một chuỗi các số tự nhiên '0, 1, 2, ...'. Đó là lý do loại tham chiếu của nó là 'const': bạn không thể hack' 2' để trở thành '3'. –

+0

"Tôi cần một trình vòng lặp cho lớp thu thập truy cập ngẫu nhiên tùy chỉnh của tôi." có lẽ không tương thích với "Tôi là người mới". Tôi có thể hỏi tại sao bạn cần một lớp sưu tập tùy chỉnh? –

+0

"Trình vòng lặp của tôi về cơ bản chỉ là một' size_t' đơn giản "Tôi không hiểu.'size_t' không đáp ứng các yêu cầu của khái niệm iterator – KABoissonneault

Trả lời

1

Tại sao tăng :: count_iterator xác định loại tham chiếu của nó là const?

Mục đích của nó, as described here, là để lấp đầy mảng với đối tượng tự tăng lên khi trình vòng lặp được tăng lên. Có một cái nhìn ngắn gọn thông qua các tài liệu của nó (tôi không có chuyên gia Boost btw) có vẻ như giữ một bản sao của đối tượng Incrementable mà bạn đưa nó. Sau đó nó trả về tham chiếu const cho bản sao nội bộ của nó, để ngăn chặn ai đó sửa đổi bản sao nội bộ của nó.

Khi tôi đã hoàn tất việc gia tăng, tôi phải nhận ra rằng count_iterator xác định loại tham chiếu của nó là const Incrementable &.

Có, khi tham chiếu nó sẽ trả về tham chiếu liên tục cho đối tượng Incrementable mà nó giữ, chính nó không cố định (do đó có thể tăng và giảm).

Tôi tin rằng điều này sẽ ngăn không cho tôi sử dụng trình vòng lặp với std :: sort vì không thể sử dụng bộ lặp const để hoán đổi các phần tử thu thập.

đúng :) Dưới-the-hood một swap trông giống như

using T = size_t; 
T tmp = a; 
a = b; // requires a to be non-constant 
b = tmp; // requires b to be non-constant 

Tôi nên sử dụng để thay thế?

Phụ thuộc vào vùng chứa của bạn. Trình lặp đến vùng chứa phải chứa con trỏ tới phần tử trong vùng chứa. Bạn có thể chỉ cần tái mục đích một iterator tiêu chuẩn.

+0

Bạn nói đúng, 'đếm_iterator' rõ ràng có mục đích khác. Thật không may, bộ sưu tập của tôi không cho phép một con trỏ đơn giản đến một phần tử sưu tập. Bộ sưu tập của tôi giống như một quan hệ SQL và nó lưu trữ các phần tử của nó theo cột. Mặt khác, trình vòng lặp, các mô hình truy cập theo hàng để đọc và ghi vào trình vòng lặp phải trải qua một số loại quy trình dịch thuật. Do đó, các con trỏ đơn giản không phải là một tùy chọn. –

+0

bạn đang nghĩ đến trình vòng lặp chuẩn nào? Tôi chỉ có thể tìm các trình vòng lặp được ràng buộc với các loại bộ sưu tập cụ thể. –

+0

Tôi không phải là một chuyên gia SQL, nhưng nếu bạn đang sử dụng 'std :: tuple' của' std :: vector's thì tôi không nghĩ rằng nó có thể lặp qua bộ tuple với một trình lặp ([xem tại đây về cách bạn có thể thực hiện nó theo cách đệ quy] (http://stackoverflow.com/a/6894436/6367128)). Tất cả các vectơ có chứa cùng kiểu cơ bản không? Nếu vậy, bạn có thể tránh tuple và sử dụng một vec tơ vectơ. – Judge

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