为什么没有更多的迭代器随机访问?

2023-12-05

我正在尝试了解有关 C++ 中的 STL 迭代器的更多信息。我理解不同的数据结构如何具有不同的迭代器,但我不明白为什么有些迭代器不是随机访问。例如,为什么 LinkedList 迭代器不是随机访问迭代器?我知道 LinkedList 本身并不是“随机访问结构”,但是我们不能实现迭代器来给出随机访问结构的错觉吗?例如,LinkedList 有一个双向迭代器,它没有定义 + 或 += 运算符,但定义了 ++ 运算符。我们不能只使用以下内容来定义 + 和 += 运算符:

iterator operator+= (int steps) {
     for (int i = 0; i < steps; ++i) {
          this->operator++();
     }
}

在查看了 RandomAccessIterator 的要求之后,我认为我们可能可以为 LinkedList 实现大部分(如果不是全部)这些函数,那么为什么不呢?我猜测这是因为某些操作基本上具有 O(N) 时间复杂度,但我不确定这是否是关键问题。如果我们使用这种方法实现 RandomAccessIterators,这会对使用带有 STL 算法的 LinkedList 产生什么后果?我们会突然能够使用 std::sort 函数对 LinkedList 进行排序吗?


我猜测这是因为某些操作基本上具有 O(N) 时间复杂度,但我不确定这是否是关键问题。

是的,这正是关键问题。迭代器是根据指针建模的。而有了指针,人们就有了一定的期望。这些期望之一是指针加法和减法是非常快的操作(具体来说,O(1))。标准库的设计者决定满足这些期望。因此,如果标准库迭代器无法在 O(1) 内执行加法和减法,则它不会实现这些操作,并且不被归类为随机访问迭代器。

请注意,使用递增和递减运算符 (++ and --),性能要求稍微宽松,并且有一些迭代器以 O(log n) 而不是 O(1) 的速度实现这些迭代器。这种妥协是必要的,因为如果不能递增或递减迭代器,那么它就没有多大用处。

如果我们使用这种方法实现 RandomAccessIterators,这会对使用带有 STL 算法的 LinkedList 产生什么后果?我们会突然能够使用 std::sort 函数对 LinkedList 进行排序吗?

是的。但它会变成(至少)一个 O(n^2) 算法,而不是标准所承诺的 O(n log n) 。

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

为什么没有更多的迭代器随机访问? 的相关文章

随机推荐

  • PHP:在 XML 中搜索字符串

    我尝试下面的搜索代码 但它只显示第一个子节点 我的代码中缺少什么吗 目录 xml
  • 使用 WCF 数据服务进行分页

    我的问题是关于如何使用 WCF 数据服务处理分页 我想要使 用它的方式是执行查询 传递页面大小和当前页面 并返回该查询的结果以及分页信息 例如总页数 当前页码和页面大小 客户端 这是另一个将结果转换为 JSON 供使用该结果的移动应用程序使
  • 连接向量中的相邻字符串

    Given qz lt quantile c 1 2 3 4 5 6 7 8 9 10 c 0 0 0 2 0 4 0 6 0 8 1 0 我想从分位数创建一个标签向量 目前 我这样做 zlab lt c paste paste sprin
  • 从另一个 2D 数组的元素中过滤 2D 数组

    我有两组数字元素存储为二维数组 使用以下方法从列中获取值 getValues 一个是完整列表 另一个是部分列表 我想要一个返回完整列表减去部分列表的函数 The partialListArr可能包含重复项 这fullListArr做 不是
  • Backbone:视图内的视图列表

    让我先展示我需要什么 以便您能够理解我的问题 我有一个联系人视图 例如 ContactView Backbone View extend template template Name E mail Phones render functio
  • R 语言的基本等值线州地图

    我很抱歉 因为我很确定这是一个基本问题 我想做的就是使用maps包在R中创建一个非常简单的等值线地图 这是我第一次尝试在 R 中映射任何数据 我所在的地区是美国本土 48 个州 包括华盛顿特区 这是我想要绘制的数据集的前几行 gt head
  • 调试密钥和签名密钥之间的区别

    您好 我正在尝试获取我的签名证书的签名密钥 MD5 指纹 有人可以告诉我签名密钥和调试密钥之间的区别吗 我能够指纹调试密钥 但为了获取签名密钥指纹 我很困惑 keytool list alias alias name keystore my
  • 如何从VB.Net中的DataGridView获取单元格值?

    我有一个问题 如何从 datagridview 的单元格中获取值 id p w post 1 1234 A 2 4567 S 3 6789 A 我想在文本框中输入3 该怎
  • 三元运算符的语法错误[重复]

    这个问题在这里已经有答案了 我是Python新手 我正在尝试使用具有这种格式的三元运算符 我认为是这样 value true if
  • 加特林如何在两个场景之间传递价值?

    我的脚本中有两个场景 我想将 CreateId 的值传递给第二个场景 我在第一个场景中保存了 CreateId 错误说 未定义名为 CreateId 的属性 jsonPath id find 0 exists 什么也没找到 场景 1 val
  • WinForms 中具有 alpha 通道透明度/不透明度的启动屏幕

    如何在 WinForms 中使用具有 alpha 通道透明度 不透明度的图像来实现启动屏幕 看一眼C 中的每像素 Alpha 混合
  • 文化特定数据注释

    我正在尝试获取特定于文化的数据注释 DisplayFormat DataFormatString 0 d public DateTime Date get set 我认为这会起作用 因此 在美国 它会显示 DD MM yyyy 在欧洲 它会
  • Snow Leopard、Django 和 PIL 的问题

    自从升级到 Snow Leopard 以来 我在让 Django 和 PIL 正常工作时遇到了一些问题 我已经安装了 freetype libjpeg 和 PIL 它告诉我 TKINTER support ok JPEG support o
  • 在 kotlin lambda 内部返回时“此处不允许返回”

    我使用 lambda 来处理异步调用的回调 我想在调用方法之外定义回调以避免使用庞大的方法 但我似乎无法在 lambda 中使用早期返回 这使得代码不必要地难以阅读 我尝试将 lambda 定义为变量 但 return 在 lambda 内
  • Promise 的动态顺序执行

    我有需要按顺序运行的动态数量的承诺 我了解如何按顺序运行承诺 但我无法成功地使其与许多可能变化的承诺保持动态 这是我发现静态执行此操作的一种方法如何兑现一个又一个的承诺 function waitFor timeout return new
  • Python实时绘制ROS数据

    我正在尝试使用 python 绘制传入计算机的实时数据 数据来自 ROS 主题 我使用 rospy 订阅该主题以获取数据 这是我写的代码 import rospy from sensor msgs msg import ChannelFlo
  • 如何使我的所有网址都无扩展名,且不带尾部斜杠。并将 .php 和尾部斜杠重定向为无?

    我想让我的所有网址统一干净 这意味着我所有的 URL 都没有扩展名 也没有尾部斜线 并且如果一个人确实输入了 php或尾部斜杠 它只会将用户重定向到干净的 URL Example example com blog file php and
  • 如何对 UTF-8 字符使用 String 方法?

    如何对 UTF 8 字符使用 String 方法 例如 我有一个带有西里尔字符的字符串 所以当我使用string upcase它不起作用 Ruby 仅支持字母的大小写转换A Z and a z 原因很简单 其他字母的大小写转换没有明确定义
  • Resteasy 客户端的自定义 Jackson 序列化器

    是否可以为 Resteasy 客户端注册自定义 Jackson JSON 序列化器 我尝试过做类似的事情 ResteasyClient client new ResteasyClientBuilder register new Custom
  • 为什么没有更多的迭代器随机访问?

    我正在尝试了解有关 C 中的 STL 迭代器的更多信息 我理解不同的数据结构如何具有不同的迭代器 但我不明白为什么有些迭代器不是随机访问 例如 为什么 LinkedList 迭代器不是随机访问迭代器 我知道 LinkedList 本身并不是