Разница между вектором векторов и пользовательским классом - PullRequest
2 голосов
/ 13 марта 2011

Мне было интересно, в чем разница (любого рода) при использовании вектора векторов для представления 2D-матрицы или создания класса, подобного:

template < class T > 
class Matrix2D {
public:
    Matrix2D( unsigned m, unsigned n ) : m( m ), n( n ), x( m * n ) {} ;
    Matrix2D( const Matrix2D<T> &matrix ) : m( matrix.m ), n( matrix.n) x( matrix.x ) {} ;
    Matrix2D& operator= ( const Matrix2D<T> &matrix ) ;
    T& operator ()( unsigned i, unsigned j ) ;
    void resize( int nx, int ny ) ;
private:
    unsigned m, n ;
    std::vector< T > x ;         
} ;


template <class T>
T& Matrix2D<T>::operator ()( unsigned i, unsigned j ) {
    return x[ j + n * i ] ;
}

template <class T>
Matrix2D<T>& Matrix2D<T>::operator= ( const Matrix2D<T> &matrix ) {
    m = matrix.m ;
    n = matrix.n ;
    x = matrix.x ;
    return *this ;
}

template <class T>
void Matrix2D<T>::resize( int nx, int ny ) {
    m = nx ;
    n = ny ;
    x.resize( nx * ny ) ;
}

Редактировать: Игнорировать метод изменения размера, как указал Эрик, он не будет сохранять исходные данные. Я добавил только для конкретной задачи, где я не возражаю. Базовый класс - это просто оператор ctor и оператор ().

1 Ответ

2 голосов
/ 13 марта 2011
  • - .resize() не сохранит существующие данные в исходных позициях.
  • - Различия в синтаксисе, operator() против operator[]
  • - Без итераторов и без использования, например. std:: алгоритмы
  • + Лучшее месторасположение, вспомогательный вектор имеет непрерывную память
  • + Более понятный синтаксис для инициализации
  • + Гарантирует, что массив не неровный

Короче говоря, класс хорош и, вероятно, лучше для специализированных целей, но он не очень хорошо подходит для общего назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...