如何有效地将 stl 容器还原为旧值
How to efficiently restore an stl container to old values
我有一个代表图形的大类。此类包含多个复杂类型的容器(向量和集合)。在搜索过程中,我需要修改图表以避免结果中的循环。由于我必须运行许多搜索,因此我需要经常将类恢复到其原始状态。
目前,我只是将保存的保存器分配给修改后的保存器:
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;
}
};
然后将 mEdges
和 mNodes
替换为 Cow<Edge>
和 Cow<GraphNode>
的容器(或者只对节点执行此操作,因为这是复制成本更高的类型)。
您必须修改搜索逻辑以使用包装器类型(或为其提供转换运算符以const T&
),然后在需要可修改对象时显式添加对copy()
的调用,但除非必要,否则您将避免复制对象。
相关文章:
- 有效地使用std::unordered_map来插入或增加键的值
- 如何有效地在 std::vector 中插入一对?
- 有效地计算多维数组的累积和?
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 有效地将大数存储为 2 的幂用于路径问题
- 如何在C++中写入 1000 个文件时有效地缓冲
- 如何有效地找到数组中三元组和的最小差异?
- 如何在C++中有效地将数字值重新分配给字符数组
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 有效地将数据加载到 std::vector 中<char>
- 如何在使用 cin 请求 int 时有效地使用户输入万无一失?
- C++:有效地将Sha256摘要放入OpenSSL Bignum?
- 如何有效地收集给定数组中的重复元素?
- 如何有效地修剪和合并四叉树中的节点?
- 可以有效地转换 std::any 与 std::any_cast
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何有效地将 stl 容器还原为旧值