Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » was kann an math::matrix template klasse verbessern werden?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.08.2007, 00:18 Uhr
xXx
Devil



C++:
namespace math
{
    template <typename T>
    void bubble_sort(T*& arr, std::size_t size)
    {
        bool redo = false;
        do {
            redo = false;
            for (std::size_t i = 0; (i < (size - 1) && arr[i] != NULL && arr[i+1] != NULL); ++i)
                if (arr[i] > arr[i + 1])        { std::swap<T>(arr[i], arr[i + 1]); redo = true; }
        } while (redo == true);    
    }

    template <typename T>
    class matrix
    {
    public:
        matrix(std::size_t row = 1, std::size_t col = 1) : m_row(row), m_col(col)
        {
            m_data = new T*[row];
            for (std::size_t cur = 0; cur < row; ++cur)    m_data[cur] = new T[col];
        }

        ~matrix()
        {
            for (std::size_t cur = 0; cur < m_row; ++cur) delete [] m_data[cur];
            delete [] m_data;
        }

        T& operator ()(std::size_t row, std::size_t col)        { return at(row, col); }
        T* operator [](std::size_t row)        { if (row > m_row) throw std::out_of_range("row"); return m_data[row];    }

    public:
        T&            at(std::size_t row, std::size_t col)    { if (row > m_row || col > m_col) throw std::out_of_range("col or row"); return m_data[row][col]; }
        T const &    min() const        {    T const & min; for (std::size_t row = 0; row < m_row; ++row) for (std::size_t col = 0; col < m_col; ++col)    min = std::min(m_data[row][col], min); return min; }
        T const &    max() const        {    T const & max; for (std::size_t row = 0; row < m_row; ++row) for (std::size_t col = 0; col < m_col; ++col)    max = std::max(m_data[row][col], max); return max; }
        std::size_t    size() const    { return (m_row * m_col); }
        void        resize(std::size_t row, std::size_t col)
        {
            T** tmp_data = new T*[row];
            for (std::size_t cur_row = 0; cur_row < row; ++cur_row)
            {
                tmp_data[cur_row] = new T[col];
                for (std::size_t cur_col = 0; cur_col < col; ++cur_col)    if (cur_col < m_col && m_row > cur_row)    tmp_data[cur_row][cur_col] = m_data[cur_row][cur_col];
            }
            for (std::size_t cur = 0; cur < m_row; ++cur) delete [] m_data[cur];
            delete [] m_data;
            m_data = tmp_data;    m_row = row; m_col = col;
        }

        void        sort()            { for (std::size_t cur_row = 0; cur_row < m_row; ++cur_row) bubble_sort<T>(m_data[cur_row], m_col); }

    private:
        T**                m_data;
        std::size_t        m_row;
        std::size_t        m_col;
    };
};

int main()
{
    math::matrix<int> mat(4, 4);
    mat.at(1, 1) = mat.size();
    mat.resize(6,6);
    mat(5, 1) = 1;
    ++mat[5][1];
    return mat.at(5, 1);
}
... was würdet ihr noch verbessern? Wo sind die Schwachstellen? Bin eig. rel. zufrieden damit ^^ Würdet ihr noch iteratoren einbauen?

Mfg Deviloper
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.08.2007, 08:58 Uhr
(un)wissender
Niveauwart


Die Formtierung verbessern, dass würde ich tun!
Und std::sort verwenden!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.08.2007, 10:47 Uhr
xXx
Devil


hmm die Formatierung wird nur von dem Forum so scheiße gemacht ^^ Nja ... was hätte std.:sort für Vorteile?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.08.2007, 11:39 Uhr
(un)wissender
Niveauwart


Schneller? Nicht selber implementiert? Flexibler?
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 05.08.2007 um 11:40 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.08.2007, 12:10 Uhr
xXx
Devil


Hmm ... ok ... nen paar Sachen auch direkt verändert:

C++:
#include <algorithm>
#include <stdexcept>

namespace math
{
    template <typename T>
    class matrix
    {
    public:
        matrix(std::size_t row = 1, std::size_t col = 1) : m_row(row), m_col(col)
        {
            m_data = new T*[row];
            for (std::size_t cur = 0; cur < row; ++cur) m_data[cur] = new T[col];
        }

        ~matrix()
        {
            for (std::size_t cur = 0; cur < m_row; ++cur) delete [] m_data[cur];
            delete [] m_data;
        }

        T& operator ()(std::size_t row, std::size_t col)                { return at(row, col);    }
        T const& operator () (std::size_t row, std::size_t col) const    { return at(row, col);    }
        T* operator [](std::size_t row)                                    { return m_data[row];    }

    public:
        T&            at(std::size_t row, std::size_t col)        { if (row >= m_row || col >= m_col) throw std::out_of_range("col and/or row"); return m_data[row][col]; }
        T const&    at(std::size_t row, std::size_t col) const    { if (row >= m_row || col >= m_col) throw std::out_of_range("col and/or row"); return m_data[row][col]; }
        T const &    min() const        {    T const & min; for (std::size_t row = 0; row < m_row; ++row) for (std::size_t col = 0; col < m_col; ++col)    min = std::min(m_data[row][col], min); return min; }
        T const &    max() const        {    T const & max; for (std::size_t row = 0; row < m_row; ++row) for (std::size_t col = 0; col < m_col; ++col)    max = std::max(m_data[row][col], max); return max; }
        std::size_t    size() const    { return (m_row * m_col); }
        void        resize(std::size_t row, std::size_t col)
        {
            T** tmp_data = new T*[row];
            for (std::size_t cur_row = 0; cur_row < row; ++cur_row)
            {
                tmp_data[cur_row] = new T[col];
                for (std::size_t cur_col = 0; cur_col < col; ++cur_col)    if (cur_col < m_col && m_row > cur_row)    tmp_data[cur_row][cur_col] = m_data[cur_row][cur_col];
            }
            for (std::size_t cur = 0; cur < m_row; ++cur) delete [] m_data[cur];
            delete [] m_data;
            m_data = tmp_data;    m_row = row; m_col = col;
        }

        void            sort()            { for (std::size_t cur_row = 0; cur_row < m_row; ++cur_row) std::sort<T>(m_data[cur_row], m_data[cur_row] + m_col); }

    private:
        T**                m_data;
        std::size_t        m_row;
        std::size_t        m_col;
    };
};



C++:
#include <iostream>
#include "math.h"

template<typename T>
void show(const math::matrix<T>& mat, std::size_t row, std::size_t col)
{
    std::cout << mat(row, col) << std::endl;
}

int main()
{
    math::matrix<int> mat(4, 4);
    mat.at(1, 1) = mat.size();
    mat.resize(6,6);
    try
    {
        mat(6, 6) = 1;
    } catch(std::out_of_range& ex)
    {
        std::cout << ex.what() << std::endl;
    }
    mat(5, 1) = 1;
    show<int>(mat, 5, 1);
    ++mat[5][1];
    show<int>(mat, 5, 1);
}
...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.08.2007, 08:05 Uhr
~wissender
Gast



Zitat von (un)wissender:
Schneller? Nicht selber implementiert? Flexibler?


Nicht unbedingt schneller.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: