Question

Je travaille actuellement sur une classe de base de données ADN et j'associe actuellement chaque ligne de la base de données à un score de correspondance (basé sur la distance d'édition) et à la séquence d'ADN elle-même. boucle d'itération?

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

La raison pour laquelle je le fais est que je peux les trier par score plus tard. J'ai d'abord essayé les cartes et reçu une erreur de compilation lors de la modification, mais existe-t-il un meilleur moyen de stocker toutes les informations pour un tri ultérieur?

Était-ce utile?

La solution

Pour répondre à votre première question, oui. Il est parfaitement sûr de modifier les membres de votre paire, car les données réelles de la paire n’affectent pas le vecteur lui-même.

modifier: j'ai l'impression que vous obtenez une erreur lors de l'utilisation d'une carte car vous avez essayé de modifier la valeur en premier de la paire interne de la carte. Cela ne serait pas autorisé car cette valeur fait partie du fonctionnement interne de la carte.

Comme indiqué par les dribeas :

Dans les cartes, vous ne pouvez pas changer en premier car cela briserait l'invariant de la carte en un arbre équilibré trié

modifier: Pour répondre à votre deuxième question, je ne vois absolument rien de mal à structurer les données, mais la base de données conserverait les pointeurs sur < code> DnaPairT au lieu des objets eux-mêmes. Cela réduirait considérablement la quantité de mémoire copiée pendant la procédure de tri.

#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 ...
}

La seule raison pour laquelle vous pourriez avoir besoin de rechercher des méthodes plus efficaces est si votre base de données est si énorme que la boucle de tri prend trop de temps à terminer. Si tel est le cas, j’imagine que votre fonction query est celle qui prend le plus de temps.

Autres conseils

Vous ne pouvez pas modifier car la première variable de std :: pair est définie const

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top