Pergunta

Atualmente estou trabalhando em uma classe de banco de dados de DNA e atualmente associar cada linha no banco de dados com ambos uma pontuação de correspondência (com base na edição distância) e da própria sequência de DNA real, é seguro para modificar primeira desta forma dentro de uma iteração do loop?

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

A razão que eu estou fazendo isso é para que eu possa classificá-los por pontuação mais tarde. Eu tentei mapas e recebeu um erro de compilação sobre como modificar em primeiro lugar, mas há talvez uma maneira melhor do que este para armazenar todas as informações para classificar mais tarde?

Foi útil?

Solução

Para responder à sua primeira pergunta, sim. É perfeitamente seguro para modificar os membros do seu par, uma vez que os dados reais do par não afeta o vector próprio.

Editar: Eu tenho um sentimento que você estava recebendo um erro ao usar um mapa porque você tentou modificar o valor first de par interno do mapa. Isso não seria permitido porque esse valor é parte do funcionamento interno do mapa.

Como afirmado por dribeas :

Em mapas que você não pode mudar primeiro como ele iria quebrar o invariante do mapa sendo um classificado árvore equilibrada

Editar: Para responder à sua segunda pergunta, não vejo nada de errado com a maneira como você é estruturar os dados, mas eu teria o porão do banco de dados ponteiros para DnaPairT objetos, em vez dos próprios objetos. Isto reduziria drasticamente a quantidade de memória que é copiado ao redor durante o procedimento de ordenação.

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

A única razão que você pode precisar de olhar para métodos mais eficientes é se seu banco de dados é tão grande que o loop de classificação leva muito tempo para ser concluído. Se for esse o caso, porém, eu imaginaria que a sua função query seria o único a tomar a maior parte do tempo de processamento.

Outras dicas

Você não pode modificar uma vez que a primeira variável de std :: pair é definido const

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top