是否可以在 O(1) 时间内为 C++ 向量分配新值?

2024-03-06

考虑以下 Python 程序,其步骤如下:

1) 初始化两个列表A和B。

2)我们分配A = B。这个操作的时间复杂度是O(1)。

3)我们将一个新列表分配给B,该列表不会改变A。

A = [1, 2, 3]
B = [7, 8]
# A contains [1, 2, 3]
# B contains [7, 8]

#------------------------------------

A = B
# A contains [7, 8]
# B contains [7, 8]
# time complexity: O(1)

#------------------------------------

B = [55, 66, 77, 88]
# A still contains [7, 8]
# B now contains [55, 66, 77, 88]

现在,我想在 C++ 中做类似的事情,其中​​ A 和 B 是向量:

1) 初始化两个向量A和B。

2)我们分配A = B。根据以下公式,该操作的时间复杂度为O(n)en.cppreference.com http://en.cppreference.com/w/cpp/container/vector/operator%3D.

3)我们将一个新列表分配给B,该列表不会改变A。

vector<int> A = {1, 2, 3};
vector<int> B = {7, 8};
// A contains [1, 2, 3]
// B contains [7, 8]


A = B;   
// A contains [7, 8]
// B contains [7, 8]
// time complexity: O(n)


B = {55, 66, 77, 88};
// A still contains [7, 8]
// B now contains [55, 66, 77, 88]

我的问题

Python 和 C++ 程序之间的区别在于步骤 2) 的时间复杂度,其中我们分配 A = B。

  • 在 Python 中,它需要 O(1) 时间,因为我们只更改引用。然后 A“指向”B,即 A 和 B 都是对同一对象的引用。
  • 在 C++ 中,需要 O(n) 时间,因为 B 的内容被复制到 A。A 并不“指向”与 B 相同的对象。

有没有办法让C++中的向量A在O(1)时间内指向向量B?

注意:我对 C++ 不太熟悉,所以我什至不知道将 A 和 B 视为对 C++ 中向量对象的引用是否有效。


因为你不使用价值B将其分配给之后A(之后直接分配给它)您可以利用 C++11 移动语义:

vector<int> A = {1, 2, 3};
vector<int> B = {7, 8};
A = std::move(B);
// O(1), see below
// B is in indeterminate but usable state now (probably empty).

B = {55, 66, 77, 88};
// A still contains [7, 8]
// B now contains [55, 66, 77, 88]

移动赋值运算符的时间复杂度为:

恒定,除非std::allocator_traits<allocator_type>::propagate_on_container_move_assignment() is false并且分配器比较不相等(在这种情况下 线性)。

source http://en.cppreference.com/w/cpp/container/vector/operator%3D.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 O(1) 时间内为 C++ 向量分配新值? 的相关文章

随机推荐

  • 记录 CMake 脚本

    我发现自己处于一种情况 我想准确记录大量自定义 CMake 宏和函数 并且想知道如何做到这一点 首先想到的是简单地使用内置语法并且仅使用文档脚本 如下所示 FUNCTION NAME MACRO NAME description 这可以 但
  • 从适配器调用片段方法

    我需要在适配器中调用 Fragment 方法 但出现错误 ClassCastException Main MainActivity 无法转换为 PlayPauseClick Interface 我在我的片段中实现了我的界面 但我仍然收到此错
  • 每行字符数和每个文本区域的行数限制

    我正在尝试在 php 页面中创建一个多行文本区域 并且我想验证用户是否无法每行插入超过 50 个字符或超过 50 行 这个想法是 用户可以从电子表格中粘贴某些内容 但如果一行超过 50 个字符 则其余字符将被丢弃 并且不会插入到下一行中 这
  • 如何以编程方式检测位图是否具有 Alpha 通道?

    作为主题 最好使用C代码 MFC 版本 private static Boolean gc BitmapHasAlpha BitmapData gc bmpData if bmpData gt PixelFormat PixelFormat
  • Sitecore 文件夹和 IIS 权限

    设置或移动 Sitecore 解决方案时 您必须记住设置正确的文件夹权限和 IIS 权限 它类似于此处的第 3 3 3 2 3 3 3 9 节 http sdn sitecore net Products Sitecore 20V5 Sit
  • 存储一些大文本时哪个更好:XML资源文件中的字符串或类中的java字符串

    我必须存储一些长文本 以便在文本视图中使用 我一直在 xml 文件中使用字符串 但我不知道每个文本的 java 字符串是否会更好 所以 这是存储它们的最佳方式 在 XML 资源文件中创建字符串 创建一个类并将文本存储在java字符串中 Th
  • 在java中生成随机数列表

    我生成一个随机数 0 或 1 int randomColor Math random lt 0 5 0 1 我需要创建 52 个随机数 其中 26 个为 0 26 个为 1 您可以这样做 创建一个List共 52 个号码 用 26 个零和
  • 使用 sbt 从代码启动 scala repl 循环

    我正在尝试启动 scala repl 循环 使用breakif 并且正在从 SBT 构建 运行 并且我尝试遵循常见问题解答中的建议 但无法使其正常工作 有人可以给出一个用于配置设置的 MyType 示例吗 MyType 是一个代表性类 应包
  • 创建没有管理员访问权限的 venv python

    当我运行 python 时 m venv pathtomyvenv Error Command C Users user manageSQL Scripts python exe Im ensurepip upgrade default p
  • 服务器使用服务器端作为 servlet 发送事件

    我有一个使用 servlet 的简单服务器发送事件的运行实现 protected void doGet HttpServletRequest request HttpServletResponse response throws Servl
  • 在多个存储库中使用相同的 DbContext 是否明智?

    更深入地了解实体框架和存储库 以便更好地进行测试 想知道这是否明智 public interface IRepository int SaveChanges void Dispose using MyContext context new
  • Google colab 笔记本上的柯基模式是什么?

    什么是柯基模式在谷歌合作实验室做什么 可从以下位置访问Tools gt Preferences 柯基犬模式设置在标题中添加动画柯基犬 https twitter com GoogleColab status 1116487177364365
  • 在 RMarkdown 文档的 R 包中包含 TeX 标头

    我想创建一个包含 Latex 头文件的 R 包 然后可以从 RMarkdown 文档中使用该头文件来通过 TeX 创建带有幻灯片的 PDF 当我在 RMarkdown 文档的标题中包含对 Latex 文件的引用时 我可以创建幻灯片 但我不知
  • AVFoundation + AssetWriter:用图像和音频生成电影

    我必须从 iPhone 应用程序导出一部电影 其中包含 NSArray 中的 UIImage 并添加一些 caf 格式的音频文件 这些文件必须在预先指定的时间开始 现在我已经能够使用 AVAssetWriter 在浏览了本网站和其他网站上的
  • 是否可以制作一个按钮作为文件上传按钮?

    我是 php 新手 我有一个表单 在上面放置一个按钮 值作为Upload MB当用户单击此按钮时 它会重定向到一个 Web 表单 我在其中放置文件上传控件和用户上传文件 这是图像 单击此按钮后 用户将重定向到此表单 此处用户上传文件 我的问
  • 使用 Spring 批处理文件项读取器进行多线程处理

    在 Spring Batch 中 我尝试读取 CSV 文件 并希望将每一行分配给一个单独的线程并处理它 我尝试通过使用 TaskExecutor 来实现它 但是所有线程正在发生的事情是一次选择同一行 我也尝试使用 Partioner 来实现
  • Python字符串和str()方法编码和解码

    我看到Python 手册 http docs python org 2 library stdtypes html string methods提及 encode and decode 字符串方法 在 Python CLI 上运行我发现我可
  • TouchableOpacity onPress() 不适用于react-native-modal

    我正在尝试让 TouchableOpacity 与 react native modal 一起使用 当我按下按钮时 什么也没有发生 这是我的代码 按下按钮时 没有按下动画 也没有出现警报
  • 如何从 URL 获取图像到 pictureBox? (Windows 移动版)

    使用 Compact Framework 时从 URL 获取图像的最佳方式是什么以及如何 我发现的是这个 用它做了一个函数 public Bitmap getImageFromUrl HttpWebRequest request HttpW
  • 是否可以在 O(1) 时间内为 C++ 向量分配新值?

    考虑以下 Python 程序 其步骤如下 1 初始化两个列表A和B 2 我们分配A B 这个操作的时间复杂度是O 1 3 我们将一个新列表分配给B 该列表不会改变A A 1 2 3 B 7 8 A contains 1 2 3 B cont