は私が((val * 100) + secondVal
の昇順に)val
とsecondVal
の値に基づいてstd::sort()
でソートする必要があるクラスClassToSort
を持っていると言います。並べ替えながら速く何、インライン関数呼び出しまたはハッシュマップ検索
class ClassToSort {
private:
int val;
long int secondVal;
int id;
public:
inline const int getVal() const { return val; }
inline const long int getSecondVal() const { return secondVal; }
inline const int getID() const { return id; }
};
std::vector<ClassToSort*> objs;
は今、私は(どちらか、それを並べ替える(val * 100) + secondVal
の値を事前に計算し、std::unordered_map<int, long> valMap
に保管し、このマップを参照してください並べ替えながら、または関数を作成するには2つの方法がgetVal()
とgetSecondVal()
に呼び出すたびに持っていますこれにより、関数呼び出しの数が2倍になります)。ここでは、2つのオプションは次のとおりです。
std::sort(objs.begin(), objs.end(),
[&](const ClassToSort* first, const ClassToSort* second) {
return valMap[first->getID()] < valMap[second->getID()];
});
と
std::sort(objs.begin(), objs.end(),
[](const ClassToSort* first, const ClassToSort* second) {
return (first->getVal() * 100 + first->getSecondVal()) <
(second->getVal() * 100 + second->getSecondVal());
});
第二の選択肢は二回、各オブジェクトのgetter関数を呼び出すだけでなく、ことは明らかであるが、また、二度同じ計算を行います。直観的には、入力の数が多いと、関数呼び出しの数が多い場合よりもハッシュテーブルの参照が速くなり、再計算が必要になると思います。私の理解は正しいのですか?
測定してお知らせください。パフォーマンスに関して言えば、「最良の解決策」はめったにありません。むしろ、データとレイアウト、実行中のシステム、使用されている実装、その他多くの変数に強く依存しています。 –
「何が速いの?です:尺度。 – user463035818
これらの 'inline'宣言は重複しています - 関数はそれらがなければインラインです。 –