Tôi tự hỏi tại sao trong nhiều thuật toán mẫu trong STL các đối số không được truyền theo tham chiếu mà đúng theo giá trị. Dưới đây là ví dụ từ tiêu đề <iterator
>:Truyền tham số biến đổi thuật toán std theo giá trị so với tham chiếu
template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (InputIterator first, InputIterator last);
Khi tôi chuyển hai trình lặp cho chức năng này, chúng được sao chép. những suy nghĩ ngây thơ của tôi là rằng nó sẽ được tốt hơn để vượt qua những vòng lặp bởi const-tài liệu tham khảo để tránh sao chép các đối tượng iterator:
template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (const InputIterator &first, const InputIterator &last);
Người ta có thể nói rằng vòng lặp là nói chung đối tượng rất nhỏ và sao chép chúng là không tốn kém. Nhưng thậm chí vẫn còn: sao chép rẻ sẽ đắt hơn là không sao chép gì cả.
Vì vậy, lý do gì trong phiên bản STL, các trình vòng lặp được truyền theo giá trị?
Cảm ơn bạn!
Có một thứ xuất hiện trong tâm trí của tôi và ngược lại với 'const'ness trong tham chiếu: các trình vòng lặp cần được sửa đổi khi sử dụng chúng. Một chi tiết triển khai khác có thể là các trình vòng lặp thực sự được thực hiện như các con trỏ. Vì vậy, là tài liệu tham khảo trong hầu hết các trường hợp. Nếu bạn vượt qua con trỏ theo giá trị, bạn sao chép nó một lần nhưng dereference nó chỉ khi cần thiết. Nếu chính con trỏ vòng lặp được truyền bởi một con trỏ tham chiếu, thì con trỏ đó phải được bỏ qua đầu tiên, chỉ để có được trình vòng lặp. Và đó là thừa. –
@Saksham Oh, cảm ơn! :) –