Разреженный массив

126
06 марта 2022, 21:10

Пытаюсь реализовать разряженный массив и перегрузить для него оператор []. Читал, что можно перегрузить оператор на чтение и на запись (если это так, то как это сделать?) В общем хочу сделать следующее: Оператор [] для этого случая: cout<<array[0]<<endl; тут только на вывод И оператор [] для этого случая: array[0] = 1; Тут оператор возвращает значение, которое можно и изменить и вывести Для каждого случая хочу реализовать отдельную логику Изменил на это:

int operator[](int index) const {
    return dataArray[index];
}
int& operator[](int index)  {
    return dataArray[index];
}

Вызов в main:

cout << sp[0] << endl;
sp[0] = 1;
Answer 1

Что-то ничего лучше, чем вот такая жуть, в голову не приходит. И не писал бы, но раз уж в комментариях сказал А, надо говорить и Б...

#include <iostream>
#include <iomanip>
#include <map>
using namespace std;
class Array
{
    struct proxy
    {
        int operator =(int v)
        {
            m[s] = v;
            return v;
        }
        operator int()
        {
            if (m.count(s)) return m[s];
            return 0;
        }
        proxy(Array*a, size_t s):m(a->m),s(s){}
        map<size_t,int> &m;
        size_t s;
    };
public:
    Array() = default;
    proxy operator[](size_t s)
    {
        return proxy(this,s);
    }
    size_t count() { return m.size(); }
private:
    map<size_t,int> m;
};
int main(int argc, const char * argv[])
{
    Array a;
    a[5] = 4;
    for(int i = 0; i < 7; ++i) cout << a[i] << " ";
    cout << "\n" << a.count() << endl;
}

Самому не нравится, так что, надеюсь, кто-то придумает что получше...

READ ALSO
Поиск пробела в строке

Поиск пробела в строке

При нахождение пробела в строке нужно завершить программу

147
Варианты создания GUI в windows на C++

Варианты создания GUI в windows на C++

Начал недавно изучать C++ на windows, и сейчас мне очень интересно узнать от опытных людей - какие способы создания графического пользовательского...

106
Приоритеты c++-шаблонов

Приоритеты c++-шаблонов

Есть вот такой код:

81
Включать header файлы в .cpp, а не .h

Включать header файлы в .cpp, а не .h

Какое преимущество в билде от того, что header файлы будут включены вcpp, а не

75