gpt4 book ai didi

c++ - 复制构造函数调用 boost::multi_index_container 中的自定义排序谓词

转载 作者:行者123 更新时间:2023-11-30 01:25:21 28 4
gpt4 key购买 nike

我正在使用 boost::multi_index_container 为一组对象提供多个 View 和排序顺序。最近,我想使用自定义排序谓词对容器进行排序,该谓词(实质上)预先计算所有对象的属性值,然后使用这些值对它们进行排序(示例代码见下文)。

容器被正确排序,但我注意到用这个谓词排序比用 operator() 简单地访问我的 internal 属性的谓词排序需要更长的时间对象。

进一步的调查表明,我的谓词的(隐式定义的)复制构造函数被调用得非常频繁。由于谓词的每个拷贝都包含完整属性映射的拷贝,因此这需要很长时间。

我已经通过向我的对象添加一个内部属性解决了这个问题,但我仍然不相信这是最好的做法。所以,我想知道:

  • 为什么经常调用复制构造函数?
  • 我是否正确定义了谓词?谓词不应该包含这么多内部数据吗?
  • 有什么比定义另一个内部对象属性更好的解决方案?

这是我的代码的相关部分。我没有详细描述 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() );

最佳答案

一个解决方案是在谓词之外构造一次属性映射,并让谓词持有对该映射的 const 引用。另一种选择是将 std::refboost::ref 传递给排序函数的谓词。这将避免不必要地复制 Predicatestd::map 数据成员。

Predicate p; // builds map internally
_container.sort( boost::ref(p) );

关于c++ - 复制构造函数调用 boost::multi_index_container 中的自定义排序谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12383610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com