Nó có thể là O (1) nếu danh sách sẽ lưu trữ một lá cờ cho phép hoán đổi ý nghĩa của các con trỏ của nhà cái prev
và next
một trong những nút có. Nếu việc đảo ngược danh sách sẽ là một hoạt động thường xuyên, thì việc bổ sung như vậy trên thực tế có thể hữu ích và tôi không biết bất kỳ lý do nào khiến việc thực hiện nó sẽ bị cấm theo tiêu chuẩn hiện tại. Tuy nhiên, việc có một lá cờ như vậy sẽ khiến cho việc duyệt qua danh sách trở nên đắt đỏ hơn (nếu chỉ bởi một yếu tố không đổi) bởi vì thay vì
current = current->next;
trong operator++
danh sách lặp, bạn sẽ nhận được
if (reversed)
current = current->prev;
else
current = current->next;
đó không phải là thứ bạn quyết định thêm dễ dàng. Cho rằng các danh sách thường được duyệt qua thường xuyên hơn nhiều so với chúng bị đảo ngược, sẽ rất không khôn ngoan khi tiêu chuẩn bắt buộc kỹ thuật này. Do đó, hoạt động ngược lại được phép có độ phức tạp tuyến tính. Tuy nhiên, xin lưu ý rằng t ∈ O (1) t ∈ O ( n ) vì vậy, như đã đề cập trước đó, việc triển khai tối ưu hóa kỹ thuật của bạn sẽ được cho phép.
Nếu bạn đến từ Java hoặc nền tương tự, bạn có thể tự hỏi tại sao trình lặp phải kiểm tra cờ mỗi lần. Thay vào đó, chúng ta không thể có hai loại trình lặp khác nhau, cả hai đều xuất phát từ một loại cơ sở chung, và có std::list::begin
và std::list::rbegin
trả về đa hình cho trình lặp thích hợp không? Trong khi có thể, điều này sẽ làm cho toàn bộ điều thậm chí còn tồi tệ hơn bởi vì tiến bộ iterator sẽ là một cuộc gọi hàm gián tiếp (khó để nội tuyến) ngay bây giờ. Trong Java, dù sao bạn cũng trả giá này thường xuyên, nhưng một lần nữa, đây là một trong những lý do khiến nhiều người tiếp cận với C ++ khi hiệu suất rất quan trọng.
Như được chỉ ra bởi Benjamin Lindley trong các bình luận, vì reverse
không được phép vô hiệu hóa các trình vòng lặp, cách tiếp cận duy nhất được tiêu chuẩn cho phép dường như là lưu trữ một con trỏ trở lại danh sách bên trong iterator gây ra truy cập bộ nhớ gián tiếp kép.