我目前正在研究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;
}
我这样做的原因是我可以稍后按分数对它们进行排序。我已经尝试过地图并收到有关首先修改的编译错误,但是有没有比这更好的方法来存储所有信息以便以后进行排序?
答案 0 :(得分:5)
回答你的第一个问题,是的。修改对的成员是完全安全的,因为对中的实际数据不会影响向量本身。
编辑:我觉得您在使用地图时遇到错误,因为您尝试修改地图内部对的first
值。这是不允许的,因为该值是地图内部工作的一部分。
如dribeas所述:
在地图中,您无法先更改,因为它会破坏作为排序平衡树的地图的不变量
编辑:为了回答你的第二个问题,我认为你构建数据的方式没有任何问题,但我会让数据库把指针改为{ {1}}对象,而不是对象本身。这将大大减少在排序过程中复制的内存量。
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 ...
}
函数将占用大部分处理时间。
答案 1 :(得分:1)
由于std :: pair的第一个变量定义为const
,因此无法修改