我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() );