我目前正在研究 DNA 数据库类,并且目前将数据库中的每一行与匹配分数(基于编辑距离)和实际 DNA 序列本身相关联,在迭代循环中首先以这种方式修改是否安全?

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

我这样做的原因是为了以后可以按分数对它们进行排序。我尝试过地图并收到有关首先修改的编译错误,但是是否有比这更好的方法来存储所有信息以供稍后排序?

有帮助吗?

解决方案

回答你的第一个问题,是的。修改对的成员是完全安全的,因为对中的实际数据不会影响向量本身。

编辑: 我有一种感觉,您在使用地图时遇到错误,因为您尝试修改 first 地图内部对的值。这是不允许的,因为该值是地图内部工作的一部分。

正如所述 德里比亚斯:

在地图中,您不能首先更改,因为这会破坏地图作为排序平衡树的不变性

编辑: 为了回答你的第二个问题,我认为你构建数据的方式没有任何问题,但我会让数据库保留 指针DnaPairT 对象,而不是对象本身。这将大大减少排序过程中复制的内存量。

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

您可能需要研究更有效的方法的唯一原因是,如果您的数据库太大,以至于排序循环需要很长时间才能完成。但如果是这样的话,我想你的 query 函数将占用大部分处理时间。

其他提示

可以不因为可变第一STD的修改::对是定义常量

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top