Domanda

Attualmente sto lavorando su una classe di database del DNA e attualmente associo ogni riga nel database sia con un punteggio di corrispondenza (basato sulla modifica della distanza) che con la sequenza del DNA stesso, è sicuro modificare prima in questo modo all'interno di un ciclo di iterazione?

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

Il motivo per cui lo sto facendo è che posso ordinarli in base al punteggio in seguito. Ho provato le mappe e ho ricevuto un errore di compilazione sulla modifica prima, ma c'è forse un modo migliore di questo per memorizzare tutte le informazioni per l'ordinamento in seguito?

È stato utile?

Soluzione

Per rispondere alla tua prima domanda, sì. È assolutamente sicuro modificare i membri della tua coppia, poiché i dati effettivi nella coppia non influiscono sul vettore stesso.

modifica: Ho la sensazione che stavi ricevendo un errore durante l'utilizzo di una mappa perché hai provato a modificare il valore first della coppia interna della mappa. Ciò non sarebbe consentito perché quel valore fa parte del funzionamento interno della mappa.

Come affermato da dribeas :

Nelle mappe non è possibile cambiare prima in quanto spezzerebbe l'invariante della mappa essendo un albero bilanciato ordinato

modifica: Per rispondere alla tua seconda domanda, non vedo nulla di sbagliato nel modo in cui stai strutturando i dati, ma vorrei che il database contenesse puntatori su < code> DnaPairT , anziché gli oggetti stessi. Ciò ridurrebbe drasticamente la quantità di memoria che viene copiata durante la procedura di ordinamento.

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

L'unica ragione per cui potresti aver bisogno di esaminare metodi più efficienti è se il tuo database è così enorme che il ciclo di ordinamento impiega troppo tempo per essere completato. In tal caso, immagino che la tua funzione query sia quella che impiega la maggior parte del tempo di elaborazione.

Altri suggerimenti

Non puoi modificare poiché la variabile prima di std :: pair è definita const

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top