Pregunta

Actualmente estoy trabajando en una clase de base de datos de ADN y actualmente asocio cada fila de la base de datos con un puntaje de coincidencia (basado en la distancia de edición) y la secuencia de ADN en sí, ¿es seguro modificar primero de esta manera dentro de un bucle de iteración?

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 razón por la que estoy haciendo esto es para poder ordenarlos por puntuación más adelante. He probado los mapas y recibí un error de compilación acerca de la modificación primero, pero ¿hay quizás una mejor manera que esta para almacenar toda la información para ordenarla más tarde?

¿Fue útil?

Solución

Para responder a su primera pregunta, sí. Es perfectamente seguro modificar los miembros de su par, ya que los datos reales en el par no afectan el vector en sí.

editar: Tengo la sensación de que estaba recibiendo un error al usar un mapa porque trató de modificar el valor de first del par interno del mapa. Eso no estaría permitido porque ese valor es parte del funcionamiento interno del mapa.

Según lo indicado por dribeas :

En los mapas no puede cambiar primero, ya que rompería la invariabilidad del mapa como un árbol equilibrado ordenado

editar: Para responder a su segunda pregunta, no veo nada de malo en la forma en que está estructurando los datos, pero la base de datos contendría punteros a < code> DnaPairT objetos, en lugar de los objetos mismos. Esto reduciría drásticamente la cantidad de memoria que se copia durante el procedimiento de clasificación.

#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 única razón por la que podría necesitar buscar métodos más eficientes es si su base de datos es tan enorme que el ciclo de clasificación tarda demasiado en completarse. Sin embargo, si ese es el caso, me imagino que su función query sería la que ocuparía la mayor parte del tiempo de procesamiento.

Otros consejos

No se puede modificar ya que la variable primero de std :: pair se define const

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top