我有一个代表图表的大班。该类包含复杂类型的几个容器(矢量和集合)。 在搜索过程中,我需要修改图形以避免结果中的循环。 由于我必须运行许多搜索,我需要经常将类恢复到其原始状态。
目前,我只是将已保存的汇总人员分配给已修改的汇总人员:
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?
答案 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;
}
};
然后将mEdges
和mNodes
替换为Cow<Edge>
和Cow<GraphNode>
的容器(或仅对节点执行此操作,因为这是要复制的更昂贵的类型)。
您必须修改搜索逻辑以使用包装器类型(或将转换运算符赋予const T&
),然后在需要可修改对象时显式添加对copy()
的调用,但除非必要,否则你会避免复制对象。