Mit QVector Daten 2-dimensional zwischenspeichern

Alles rund um die Programmierung mit Qt
Antworten
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Mit QVector Daten 2-dimensional zwischenspeichern

Beitrag von chrislo1976 »

Hallo zusammen!

Ich mache gerade einen Versuch, Daten aus eine SqlQuery in eine Datenbank-unabhängige Klasse zwischenzuspeichern. Diese DB-unabhängige Klasse wird dann an eine andere Klasse/Funktion weitergereicht.

Ich habe das mit einem QVector gelöst, der Objekte von Typ QVariant aufnimmt. QVariant deshalb, weil die ja auch von der QSqlQuery geliefert werden und es mich innerhalb dieser Klasse nicht interessiert was genau in den Daten steckt. Erst in der Zielklasse werden die Daten dann entsprechend gewandelt.

Hier mal die (recht einfache) Klasse:

Code: Alles auswählen

#ifndef VARIANTLIST_H_
#define VARIANTLIST_H_

#include <QVariant>
#include <QVector>


class VariantList
{

public:
    
    VariantList();
    ~VariantList();

    void setColumns(qint32 columns);
    qint32 columns();

    qint32 rows();

    void append(const QVariant& value);
    const QVariant& at(qint32 row, qint32 column);

    void clear();


private:

    QVector<QVariant>   m_list;
    qint32              m_columns;
};

#endif /* VARIANTLIST_H_ */

Code: Alles auswählen

#include "variantlist.h"


VariantList::VariantList()
{
}

VariantList::~VariantList()
{
}

void VariantList::setColumns(qint32 columns)
{
    m_columns = columns;
    m_list.clear();
}

qint32 VariantList::columns()
{
    return m_columns;
}

qint32 VariantList::rows()
{
    qint32 l = m_list.size();

    qint32 rows = l / m_columns;

    return rows;
}

void VariantList::append(const QVariant& value)
{
    m_list.append(value);
}

const QVariant& VariantList::at(qint32 row, qint32 column)
{
    qint32 i = (row * m_columns) + column;

    Q_ASSERT(i >= 0 && i < m_list.size());

    return m_list.at(i);
}

void VariantList::clear()
{
    m_list.clear();
}
Die Klasse funktioniert eigentlich so wie ich es mir vorstelle und auch von der Geschwindigkeit ist/wäre es akzeptabel (ca. 3s bei 1 Mio Feldern).

Sieht jemand von euch evtl. eine Schwachstelle oder noch Optimierungspotential?

Danke schon mal für Hinweise!

Gruß
Christian
Kratzy974
Beiträge: 23
Registriert: 29. September 2009 13:25

Beitrag von Kratzy974 »

Hi Christian,

ich würde vielleicht weitere Methoden einbauen. Da wäre eine Methode um ein QVariant an eine definierte Stelle zu schreiben.
Die Aktuelle Klasse ist sehr speziallisiert. es ist eigendlich kaum mehr möglich, als sequenziell zu schreiben, und dann Write Protected darauf mit Wahlfreier Auswahl zuzugreifen.

Ich könnte mir vorstellen, dass ein Append mehr Zeit verbraucht, als es Wert ist. Wenn dir am Anfang bekannt ist, wie viele Rows du hast, würde ich die Klasse mit Variantlist(int cols, int rows) initialisieren, in dem die m_list auf die Länge eingestellt wird. Dann die Elemente vielleicht mit einem [] operator schreiben/ lesen (Sequenziell, sprich hier ist so erstmal nur ein Wert möglich, nicht col und row, und das möglichst inline).
Wenn sich die Größe nicht mehr ändern wird (also fix ist), dann würde ich vielleicht statt einen QVector ein eigenes Array machen (QVariant *m_list), welches am Anfang mit new erstellt wird wird.

Grüße,

Kristian
Antworten