私はboost::multi_index_container
、オブジェクトのセットに対して複数のビューと並べ替え順序を提供するために使用しています。最近、(本質的に)すべてのオブジェクトの属性値を事前に計算し、これらの値を使用してそれらを並べ替えるカスタム並べ替え述語を使用してコンテナーを並べ替えたいと思いました(コード例については以下を参照)。
コンテナは正しくソートされますが、この述語を使用したソートは、オブジェクトの内部プロパティにoperator()
アクセスするだけの述語を使用したソートよりもはるかに時間がかかることに気付きました。
さらに調査したところ、私の述語の(暗黙的に定義された)コピーコンストラクターが非常に頻繁に呼び出されたことがわかりました。述語の各コピーには完全な属性マップのコピーが含まれているため、これには長い時間がかかりました。
それ以来、オブジェクトに内部属性を追加することでこれを解決しましたが、これが最善の行動であるとはまだ確信していません。だから、私は知りたいです:
- コピーコンストラクタがこれを頻繁に呼び出すのはなぜですか?
- 述語を正しく定義していますか?述語にはこれほど多くの内部データが含まれるべきではありませんか?
- さらに別の内部オブジェクト属性を定義するよりも良い解決策は何でしょうか?
これが私のコードの関連部分です。Object
その属性は問題に寄与しないため、クラスについてはあまり詳しく説明しませんでした。
class Predicate
{
public:
Predicate()
{
// fill _attributes map with attribute values for all objects
}
bool operator()(const Object& a, const Object& b) const
{
std::map<Object, double>::const_iterator firstPos = _attributes.find( a );
std::map<Object, double>::const_iterator secondPos = _attributes.find( b );
// throw error if one of the objects could not be found
return( firstPos->second < secondPos->second );
}
private:
std::map<Object, double> _attributes;
};
// Later, in order to sort the container
_container.sort( Predicate() );