Frage

Im Moment arbeite ich an einer DNA-Datenbank-Klasse und ich zur Zeit jede Zeile in der Datenbank verknüpfen beide mit einem Übereinstimmungswert (basierend auf Edit-Distanz) und die tatsächlichen DNA-Sequenz selbst, ist es sicher, zuerst auf diese Weise innerhalb einem zu modifizieren Iterationsschleife?

typedef std::pair<int, DnaDatabaseRow> DnaPairT;
typedef std::vector<DnaPairT>          DnaDatabaseT;

// ....

for(DnaDatabaseT::iterator it = database.begin();
    it != database.end(); it++)
{
    int score = it->second.query(query);
    it->first = score;
}

Der Grund, warum ich das tue, ist so, dass ich sie später nach Punkten sortieren. Ich habe Karten ausprobiert und erhielt erste Informationen zum Ändern eines Übersetzungsfehler, aber gibt es vielleicht einen besseren Weg, als dies später zum Sortieren alle Daten speichern?

War es hilfreich?

Lösung

Um Ihre erste Frage zu beantworten, ja. Es ist absolut sicher, die Mitglieder Ihres Paares zu ändern, da die eigentlichen Daten in dem Paar wirkt sich nicht auf den Vektor selbst.

bearbeiten: Ich habe das Gefühl, dass Sie einen Fehler wurden erhalten, wenn eine Karte mit, weil Sie den first Wert der Karte internen Paares zu ändern versucht. Das wäre nicht erlaubt werden, weil dieser Wert Teil der Karte Innenleben ist.

Wie bereits erwähnt von dribeas :

In Karten können Sie nicht zuerst ändern, da es die Invariante der Karte ist ein sortierte ausgeglichener Baum brechen

bearbeiten: Um Ihre zweite Frage zu beantworten, ich sehe nichts falsch mit der Art und Weisen Sie die Daten strukturieren, aber ich würde die Datenbank hält, hat Zeiger DnaPairT Objekte, statt die Objekte selbst. Dies würde dramatisch die Größe des Speichers reduzieren, die während des Sortierverfahrens um kopiert werden.

#include <vector>
#include <utility>
#include <algorithm> 

typedef std::pair<int, DnaDatabaseRow> DnaPairT;
typedef std::vector<DnaPairT *>       DnaDatabaseT;

// ...

// your scoring code, modified to use pointers
void calculateScoresForQuery(DnaDatabaseT& database, queryT& query)
{
    for(DnaDatabaseT::iterator it = database.begin(); it != database.end(); it++)
    {
        int score = (*it)->second.query(query);
        (*it)->first = score;
    }
}

// custom sorting function to handle DnaPairT pointers
bool sortByScore(DnaPairT * A, DnaPairT * B) { return (A->first < B->first); }

// function to sort the database
void sortDatabaseByScore(DnaDatabaseT& database)
{
    sort(database.begin(), database.end(), sortByScore);
}

// main
int main()
{
    DnaDatabaseT database;

    // code to load the database with DnaPairT pointers ...

    calculateScoresForQuery(database, query);
    sortDatabaseByScore(database);

    // code that uses the sorted database ...
}

Der einzige Grund, warum Sie benötigen, in effizientere Methoden zu suchen ist, wenn Ihre Datenbank so groß ist, dass die Sortierschleife vervollständigen zu lange dauert. Wenn das der Fall ist, aber ich könnte mir vorstellen, dass Ihre query Funktion die am meisten von der Bearbeitungszeit Aufnahme sein würde.

Andere Tipps

Sie können nicht, da die Variable ändern zunächst std :: pair ist definiert const

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top