向量的向量和自定义类之间的区别

发布于 2024-10-21 09:17:56 字数 1060 浏览 3 评论 0原文

我想知道使用向量向量表示 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 和 () 运算符。

I was wondering what the difference (of any kind) is when using a vector of vectors to represent a 2D matrix or make a class like:

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 ) ;
}

Edit: Ignore the resize method, as Erik pointed out it would not keep original data place. I only added for a specific task where I didn't mind. The basic class is just the ctor and the () operator.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

胡渣熟男 2024-10-28 09:17:56
  • - .resize() 不会将现有数据保留在原始位置。
  • - 语法差异,operator()operator[]
  • - 没有迭代器,并且不使用例如 std:: 算法
  • + 更好的局部性,支持向量具有连续的内存
  • + 更易于理解的初始化语法
  • + 保证数组是't jagged

简而言之,该类很好,并且可能更适合特殊用途,但它在通用用途上表现不佳。

  • - .resize() will not keep existing data in the original positions.
  • - Syntax differences, operator() vs operator[]
  • - No iterators, and no using e.g. std:: algorithms
  • + Better locality, backing vector has contiguous memory
  • + More understandable syntax for initialization
  • + Guarantees that the array isn't jagged

In short, the class is fine and likely better for specialized purposes, but it's not doing too well on generic-purpose.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文