如何有效地将 stl 容器还原为旧值

How to efficiently restore an stl container to old values

本文关键字:还原 有效地 stl      更新时间:2023-10-16

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

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

 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 毫秒。有没有更好、更快的方法来复制复杂类型的容器或至少复制边缘向量?

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

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;
  }
};

然后将 mEdgesmNodes 替换为 Cow<Edge>Cow<GraphNode> 的容器(或者只对节点执行此操作,因为这是复制成本更高的类型)。

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