C++ 中的备忘录模式2025 年 5 月 17 日 | 阅读 9 分钟 引言Memento 模式 是一种行为设计模式,用于捕获和外部化对象的内部状态,以便在不违反封装的情况下稍后将对象恢复到该状态。当您需要在应用程序中实现撤销机制、检查点或历史记录管理时,此模式特别有用。 方法 1:基本方法程序输出 Text after undo: Hello, World! 说明
复杂度分析时间复杂度 创建 memento(TextMemento 对象)涉及复制 TextEditor 的文本内容,其时间复杂度为 O(n),其中 n 是文本的长度。 将 memento 添加到 UndoManager 涉及将元素附加到 vector,平均时间复杂度为 O(1)。 通过索引从 UndoManager 检索 memento 的时间复杂度也为 O(1)。 恢复 memento 涉及将文本内容从 memento 复制回 TextEditor,其时间复杂度为 O(n)。 空间复杂度 创建 memento(TextMemento 对象)的空间复杂度为 O(n),其中 n 是要存储的文本的长度。 UndoManager 中存储 memento 的空间复杂度取决于存储的 memento 数量。如果存在 m 个 memento,则空间复杂度为 O(m * n),其中 n 是每个 memento 中文本的平均长度。 总体而言,实现的总体空间复杂度由 UndoManager 中存储 memento 所需的空间决定。 方法 2:使用序列化/反序列化引言而不是创建单独的 TextMemento 类来保存 TextEditor 的状态,您可以直接将 TextEditor 对象的状态序列化为字符串或二进制格式。序列化是将对象转换为字节流的过程,而反序列化是相反的过程。 为了创建 memento,将 TextEditor 对象的状态序列化为字符串或二进制格式并进行存储。 为了恢复状态,将序列化的状态反序列化回 TextEditor 对象。 程序输出 Text after undo: Hello, World! 说明
复杂度分析时间复杂度 将 TextEditor 对象的状态序列化为字符串涉及复制文本内容,其时间复杂度为 O(n),其中 n 是文本的长度。 将序列化的状态反序列化回 TextEditor 对象也涉及复制文本内容,时间复杂度为 O(n)。 设置和获取 TextEditor 对象文本内容是直接操作,时间复杂度为 O(1)。 总体而言,此方法中操作的时间复杂度主要取决于文本内容的长度。 空间复杂度 将 TextEditor 对象的状态序列化为字符串的空间复杂度为 O(n),其中 n 是要存储的文本内容的长度。 同样,将序列化的状态反序列化回 TextEditor 对象所需空间复杂度也为 O(n)。 将序列化的状态(memento)存储在字符串变量中的空间复杂度为 O(n),其中 n 是序列化状态的长度。 TextEditor 对象本身和其他变量的空间复杂度与序列化状态相比可以忽略不计。 总体而言,此方法总体空间复杂度由存储序列化状态所需的空间决定。 方法 3:使用 Command 模式和 Undo Stack引言而不是直接保存和恢复 TextEditor 的状态,您可以使用 Command 模式和 undo stack。 每个用户操作(如键入、删除或替换文本)都封装在一个命令对象中。每个命令对象都知道如何执行操作以及如何撤销它。 当用户执行操作时,将创建一个相应的命令对象并执行它。命令对象在执行前的状态可以作为 memento 暗示。 已执行的命令对象存储在 undo stack 中。要撤销操作,将命令对象从 undo stack 中弹出,并调用它们的 undo 方法。 程序输出 Text after undo: Goodbye, World! 说明
复杂度分析时间复杂度 使用 setText() 方法设置文本涉及创建 SetTextCommand 对象、执行命令(设置文本内容)并将命令推送到 undo stack。这些操作的时间复杂度为 O(1)。 使用 undo() 方法撤销操作涉及从 undo stack 中弹出顶部的命令并调用其 undo() 方法。这两个操作的时间复杂度都为 O(1)。 总体而言,设置文本和撤销操作的时间复杂度是恒定的,与文本内容的长度无关。 空间复杂度 TextEditor 类本身的空间复杂度是恒定的,因为它只存储用于文本内容的字符串和用于撤销命令的堆栈。 undo stack 中存储的每个命令对象都会消耗额外的内存。但是,由于只存储已执行的命令,undo stack 的空间复杂度取决于已执行命令的数量,而不是文本内容的长度。 因此,undo stack 的空间复杂度为 O(k),其中 k 是已执行命令的数量。 总体而言,此实现的空间复杂度主要由 undo stack 中存储的已执行命令的数量决定。 C++ 中 Memento 模式的属性Originator
Memento
Caretaker
|
C++ 中的 Lambda 函数提供了一种简洁的方式来定义微小的私有函数。默认情况下,来自其周围作用域的变量可以通过值或引用被 lambda 函数捕获。但是,如果没有 mutable 关键字,捕获的变量就不能被更改。Lambda...
阅读 4 分钟
简介:天际线问题是一个经典的算法挑战,涉及查找由二维平面上的一系列矩形建筑形成的剪影或“天际线”。想象一个城市景观,其中每栋建筑由一个矩形表示,由其左 x 坐标、高度和右 x 坐标定义……
阅读 12 分钟
简介 std::get_money 函数是 C++ 标准库的一部分,用于根据区域设置特定的格式规则处理货币变量。该函数用于将输入流中的货币数据提取或格式化到应用程序中,确保其格式适当……
阅读 6 分钟
?在此系列结束时,您将拥有从头开始创建桌面程序的技能,因此让我们开始创建 C++ 桌面程序的有趣之旅。Win32 编程入门:C++ 中的 Win32 编程是指使用 Win32 API 创建 Windows 应用程序,Win32 API 是……
阅读 118 分钟
在本文中,我们将讨论其语法和示例。简介 Std::piecewise_construct_t 是一个基本的 C++ 组件,它被添加到标准库中,以便更灵活有效地进行 pair 或 tuple 的构造。它作为 std::pair 和 std::tuple 的标签类型……
5 分钟阅读
第 n 个 Fuss-Catalan 数是一个非常有趣的数学概念,它扩展了标准的 Catalan 数到更广义的形式。它在组合学、几何学和计算机科学中具有重要的应用。本文将讨论数学背景、应用以及一个高效的 C++ 程序...
阅读 4 分钟
在计算机科学和编程中,它有效地操作数据的方法,其中一个说明位运算将要执行的一些工作的例子是交换字节中的两个半字节。本文深入探讨了位运算的思想、实现和用例……
阅读 4 分钟
在本文中,我们将讨论 C++ 中的 Stern 的双曲序列数,包括其方法、示例、时间复杂度和空间复杂度。Stern 的双曲序列:Stern 的双曲系列是一个整数序列,与 Calkin-Wilf 树密切相关,并遵循特定的递归关系。这个……
阅读 4 分钟
在本文中,我们讨论了启示数序列。启示数序列是数学的一个有趣领域,个人在使用 2 的幂时会以不同的方式看待它。为了达到这一点,我们分析了以 10 为底的 2 的幂,并了解了...
5 分钟阅读
在数字王国中,特殊的性质和独特的模式在数学领域广阔无垠,有些想法因其稀缺性而显得特别。令人兴奋的是,发现所谓的 Magnanimous Numbers 是其中引人入胜的想法之一。Magnanimous Number……
阅读 10 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India