如何有效地将stl容器恢复为旧值

时间:2012-06-05 21:40:54

标签: c++ performance stl

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

目前,我只是将已保存的汇总人员分配给已修改的汇总人员:

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

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

1 个答案:

答案 0 :(得分: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;
  }
};

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

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