当前位置:  开发笔记 > 编程语言 > 正文

安全修改std :: pair <U,V> ::在对向量中首先?

如何解决《安全修改std::pair<U,V>::在对向量中首先?》经验,为你挑选了1个好方法。

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

typedef std::pair DnaPairT;
typedef std::vector          DnaDatabaseT;

// ....

for(DnaDatabaseT::iterator it = database.begin();
    it != database.end(); it++)
{
    int score = it->second.query(query);
    it->first = score;
}

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



1> e.James..:

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

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

正如dribeas所述:

在地图中,您不能先改变,因为它会破坏地图的不变量,即排序平衡的树

编辑:要回答你的第二个问题,我看什么都没有错,你是构建数据的方式,但我会数据库保持指针DnaPairT对象,而不是对象本身.这将大大减少在排序过程中复制的内存量.

#include 
#include 
#include  

typedef std::pair DnaPairT;
typedef std::vector       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功能将占用大部分处理时间.


推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有