c ++ создание константного итератора для класса costum

У меня есть собственный класс шаблона -

template <class T>
class myClass{
    vector<vector<T>> matrix;
    //rest of the code...
};

Я хочу иметь возможность иметь константный итератор, начинающийся с myClass, и константный итератор, заканчивающийся для myClass, который мог бы перебирать объекты T в матрице myClass, я изо всех сил пытаюсь создать такую ​​вещь.

на мой взгляд, я хочу собрать все объекты T в матрице в некоторый локальный одномерный вектор и вернуть итератор. начать с этого вектора или итератора. end к этому вектору

кроме того, я хочу иметь возможность поддерживать цикл для каждого следующим образом:

for(const auto& obj : instaceOfMyClass)

Спасибо!


person omrib40    schedule 08.06.2020    source источник
comment
Вы можете использовать итератор сглаживания   -  person Caleth    schedule 08.06.2020


Ответы (1)


на мой взгляд, я хочу собрать все объекты T в матрице в некоторый локальный одномерный вектор и вернуть итератор. начать с этого вектора

Это означало бы копирование всей матрицы. Большое нет-нет. Не только из-за времени копирования, эффективного удвоения пространства, но также из-за того, что элементы будут дублироваться в двух местах. Когда один изменяется, другой сохраняет старое значение.

У вас есть два варианта:

Выровнять матрицу хранения

template <class T>
class myClass{
    vector<T> matrix;

    T& get(size_t line, size_t column)
    {
         return matrix[line * columns_count + column];
    }
};

Это хорошо по двум причинам: лучшая локализация кеша и простота реализации итераторов:

using ConstIterator = std::vector<T>::const_iterator;

ConstIterator cbegin() const { return matrix.cbegin(); }

Реализуйте итератор

Если вы хотите сохранить хранилище 2dim, вам необходимо реализовать итератор. На мой вкус, это чересчур шаблонный вариант, поэтому я дам вам лишь совет, с которого можно начать, если вы хотите пойти по этому пути:

Итератор должен хранить указатель / ссылку на матрицу, указатель / ссылку / индекс на текущую строку и один на текущий столбец. В ++ операции перейдите к столбцу и, если вы достигли конца столбца, увеличьте строку и сбросьте столбец.

person bolov    schedule 08.06.2020
comment
Я голосую только за этот фрагмент вашего ответа: сгладьте память матрицы - person YSC; 08.06.2020
comment
Скажем, я хочу сохранить свое хранилище массива 2dim, должен ли мой итератор содержать указатель на матрицу 2d? в противном случае, как я могу узнать, достиг ли я конца строки row / col ...? - person omrib40; 08.06.2020