変更しても安全ですstd :: pair< YOU、> :: first in pair of vector?
質問
現在、私は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
値を変更しようとしたため、マップの使用時にエラーが発生したように感じます。その値はマップの内部動作の一部であるため、これは許可されません。
dribeas によると:
マップでは、ソート済みのバランスツリーであるマップの不変式を壊すため、最初に変更することはできません
編集: 2番目の質問に答えるために、データの構造化方法にまったく問題はありませんが、ポインターを<オブジェクト自体ではなく、code> 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 :: pairの最初の変数がconstで定義されているため、変更できません
所属していません StackOverflow