Я пытаюсь создать «разреженный» вектор класс в C++, например, так:Перегрузка оператора [] для разреженного вектора
template<typename V, V Default>
class SparseVector {
...
}
Внутренне, он будет представлен в std::map<int, V>
(где V
является тип сохраненного значения). Если элемент отсутствует в карте, мы будем делать вид, что он равен значению Default
из аргумента шаблона.
Однако у меня возникли проблемы с перегрузкой оператора индекса, []
. Я должен перегрузить оператор []
, потому что я передаю объекты из этого класса в функцию Boost, которая ожидает, что []
будет работать правильно.
Версия const
достаточно проста: проверьте, находится ли индекс на карте, верните его значение, если это так, или Default
в противном случае.
Однако неконвертная версия требует, чтобы я возвращал ссылку, и именно там я столкнулся с проблемой. Если значение только , прочитайте, мне не нужно (и не хочу) добавлять что-либо к карте; но если это написано, мне, возможно, нужно будет ввести новую запись на карту. Проблема в том, что перегруженный []
не знает, находится ли значение , или , написанное. Он просто возвращает ссылку.
Есть ли способ решить эту проблему? Или, возможно, обойти это?
boost :: mapped_vector <> должен делать что-то похожее - вы можете изучить его для идей (или, может быть, просто использовать его). –
Он не поддерживает мои значения по умолчанию, а также я собирался сделать это для двумерной матрицы, поэтому использовать его прямо не может быть и речи. Но все же полезная ссылка! – Thomas