複数のMotorolla S-Record (MOT/SREC)ファイルをマージして編集する必要があります。これらのファイルは、それぞれがメモリ アドレスと関連するコンテンツで構成されているため、通常は (誰かが手動で編集したりしない限り) メモリ アドレス順に並べられます。結果を (順番に) 単一の S-Rec ファイルに書き戻します。
アドレスの順序付けと処理を簡単にするために、メモリ アドレスを整数キーとして、SREC 行全体 (アドレスを含む) を文字列値として使用するマップを使用することにしました。std::map<int,std::string> mymap;
ファイルには領域が重複している可能性があるため、「マージ」では、後続の値が既存の値を上書きできるようにする必要があります。std::insert
は既存の値を置き換えないため、 を使用することを考えていましたがoperator[]
、次の 2 つのことに興味をそそられました。
std::insert
また、「ヒント」を取り、iterator position
を返すフォームもありiterator
、これは、これから行うほとんど順序付けられた挿入のタイプに特に適しているようです。挿入に続くデータは、順序どおりに続く可能性が非常に高いため、ヒントとしての最後の位置 (つまり、最後のinsert
呼び出しで返されたイテレータを次のinsert
呼び出しに渡すだけ)?- SGI STL リファレンスから、"
m[k]
は " と同等(*((m.insert(value_type(k, data_type()))).first)).second
であり、ヒント形式と演算子 (置換あり) 形式を組み合わせることができるかどうか疑問に思いました...結局のところ、良いヒントが提供されない限り、両方の複雑さは対数です。挿入、その場合は「償却定数」になります...
結局のところ、「ヒント」を operator[] 構文に挿入して、insert-with-hint と operator[] を組み合わせることに問題はありますか? 例(*(m.insert(hint, value_type(k, data_type())))).second = value;
(これは、新しい値を割り当てる前にデフォルトのコンストラクターを使用して値を作成しますが、これは何とか回避できるかもしれませんが、文字列値については今のところあまり心配していません...)
おまけ:(m.insert(hint, value_type(k, data_type())))->second
これが、または元の例で と書かれていない理由はあり(*((m.insert(value_type(k, data_type()))).first)).second
ますか? イテレータか何かについて何か特別なことはありますか?
(それが価値があるのは、「STL マップでは、 [] よりも map::insert を使用する方が良いですか? 」 と の間の選択を 扱っており、insert
そこoperator[]
の回答は一般的に読みやすさについて議論する傾向があります。これは問題なく、良い習慣です。一般的には ですが、この質問は特に、ある程度の最適化を行う価値のある順序付けられた (またはほとんど順序付けられた) データを扱います。)