1

我有一个代表图表的大类。此类包含多个复杂类型的容器(向量和集合)。在搜索过程中,我需要修改图表以避免结果出现循环。由于我必须运行许多搜索,我需要经常将类恢复到其原始状态。

目前,我只是将保存的 continer 分配给修改后的:

 void Graph::restore(){
   mEdges=mSafeEdges; //std::vector<Edge> Edge has no heap based data
   mNodes=mSafeNodes; //std::vector<GraphNode> A Graph Node contains std::set<int>
 }

正如我所说,边和节点很复杂,每个节点都包含一个集合。每对容器具有相同的大小。分析我的代码表明,简单的恢复功能是程序的主要瓶颈,每次运行大约需要 6 毫秒。边缘向量需要 1.5 毫秒来复制,节点需要 4.5。是否有更好、更快的方法来复制复杂类型的容器或至少复制 Edge Vector ?

4

1 回答 1

0

如果您在每次搜索时只修改一些对象,那么您可以查看写时复制是否有帮助。

template<typename T>
class Cow {
  std::shared_ptr<T> owned;
  const Node* non_owned;
public:
  explicit Cow(const T& n) : non_owned(n) { }
  const T& get() const { return *non_owned; }
  T& copy() {
    if (!owned) {
      owned = std::make_shared<T>(*non_owned);
      non_owned = owned.get();
    }
    return *owned;
  }
};

然后用mEdgesandmNodes的容器替换Cow<Edge>and Cow<GraphNode>(或者只对节点这样做,因为这是复制成本更高的类型)。

您必须修改搜索逻辑以使用包装器类型(或为其提供转换运算符const T&),然后copy()在需要可修改对象时显式添加调用,但除非必要,否则您将避免复制对象。

于 2012-06-06T18:14:06.143 回答