Tôi đang cố gắng để tạo ra một "thưa thớt" class vector trong C++, như vậy:điều hành quá tải [] cho một vector thưa thớt
template<typename V, V Default>
class SparseVector {
...
}
Bên trong, nó sẽ được đại diện bởi một std::map<int, V>
(nơi V
là loại giá trị được lưu trữ). Nếu phần tử không có trong bản đồ, chúng tôi sẽ giả sử rằng phần tử này bằng với giá trị Default
từ đối số mẫu.
Tuy nhiên, tôi gặp sự cố khi quá tải toán tử chỉ số, []
. Tôi phải quá tải các nhà điều hành []
, bởi vì tôi đang đi qua các đối tượng từ lớp này vào một chức năng tăng mà mong đợi []
để hoạt động chính xác.
Phiên bản const
đủ đơn giản: kiểm tra xem chỉ mục có trong bản đồ hay không, trả về giá trị của nó nếu có hoặc Default
nếu không.
Tuy nhiên, phiên bản không phải const yêu cầu tôi trả lại tham chiếu và đó là nơi tôi gặp sự cố. Nếu giá trị chỉ là đọc, tôi không cần (cũng không muốn) thêm bất kỳ thứ gì vào bản đồ; nhưng nếu nó là được viết, tôi có thể cần phải đặt một mục mới vào bản đồ. Vấn đề là quá tải []
không biết liệu giá trị có đang là đọc hoặc được viết. Nó chỉ trả về một tham chiếu.
Có cách nào để giải quyết vấn đề này không? Hoặc có lẽ để làm việc xung quanh nó?
boost :: mapped_vector <> nên làm điều gì đó tương tự - bạn có thể nghiên cứu ý tưởng đó (hoặc có thể chỉ sử dụng ý tưởng đó). –
Nó không hỗ trợ các giá trị mặc định của tôi, và ngoài ra, tôi sẽ làm điều này cho ma trận hai chiều, do đó, sử dụng nó trực tiếp là ra khỏi câu hỏi. Nhưng vẫn là một tài liệu tham khảo hữu ích! – Thomas