2009-06-03 34 views
20

Tôi muốn sử dụng danh sách vòng tròn.Việc triển khai chuẩn của Danh sách Thông tư có tồn tại cho C++ không?

Thiếu triển khai của riêng tôi (like this person did) các tùy chọn của tôi là gì?

Cụ thể những gì tôi muốn làm là lặp qua danh sách đối tượng. Khi trình vòng lặp của tôi đến cuối danh sách, nó sẽ tự động trở lại đầu. (Có, tôi nhận ra điều này có thể nguy hiểm.)

See Vladimir's definition of a circular_iterator: "Trình thông tư tròn sẽ không bao giờ bằng với CircularList :: end(), do đó bạn luôn có thể bỏ qua bộ lặp này."

Trả lời

27

Không có danh sách vòng tròn chuẩn nào.

Tuy nhiên, có một circular buffer trong Tăng cường, điều này có thể hữu ích.

Nếu bạn không cần bất kỳ điều gì lạ mắt, bạn có thể xem xét chỉ sử dụng một số vector và truy cập các phần tử có chỉ mục. Bạn chỉ có thể mod chỉ mục của mình với kích thước của vec-tơ để đạt được nhiều điều tương tự như danh sách vòng tròn.

+3

Cảm ơn Naaff! Modding chỉ số với kích thước của vector là một giải pháp đơn giản, tôi xấu hổ vì tôi không nghĩ về nó. – Runcible

+0

Nếu bạn đảm bảo rằng kích thước của 'vectơ' là một lũy thừa của hai, sau đó thay vì chi phí đắt tiền của hoạt động mô đun, hãy sử dụng toán tử' & 'thay vì nó chỉ tốn một chu kỳ. Nó hoạt động như thế này: '(n mod (2^k)) == (n & (2^k - 1))' ví dụ 'n% 256 == (n & (255))' –

16

Nếu bạn muốn một cái gì đó trông giống như một iterator bạn có thể cuộn của riêng bạn, tìm kiếm một cái gì đó giống như

template <class baseIter> 
class circularIterator { 
    private: 
     baseIter cur; 
     baseIter begin; 
     baseIter end; 
    public: 
     circularIterator(baseIter b, baseIter e, baseIter c=b) 
      :cur(i), begin(b), end(e) {} 
     baseIter & operator ++(void) {++cur; if(cur == end) {cur = begin;}} 
}; 

(hoạt động iterator khác trái như tập thể dục cho người đọc).

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