热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么std::common_iterator只是std::forward_iterator?

C++20引入了std::common_iterator能够将元素的非公共范围(迭代器和哨兵的类型不同)表示为公共范围(它们相同)的a,其概要定义为:

C++20 引入了std::common_iterator能够将元素的非公共范围(迭代器和哨兵的类型不同)表示为公共范围(它们相同)的 a ,其概要定义为:

template S>
requires (!same_­as && copyable)
class common_iterator {
// ...
private:
variant v_; // exposition only
};

它对于与期望范围的开始和结束具有相同类型的遗留代码进行交互非常有用。

在[iterators.common#common.iter.types-1.1] 中,其iterator_­concept定义为:

iterator_­concept表示forward_­iterator_­tag如果I模型

forward_­iterator;否则表示input_­iterator_­tag

为什么common_iterator最多只能是 a forward_iterator,而不能完全定义其iterator_concept基于I's iterator_category?例如,如果Irandom_asscess_iterator,则common_iteratorrandom_asscess_iterator,依此类推。

看来,这是因为技术上是可行的common_iterator只是使用std::variant类型为擦除IS

考虑以下(Godbolt):

auto r = views::iota(0) | std::views::take(5);
static_assert( ranges::random_access_range);
auto cr = r | views::common;
static_assert(!ranges::random_access_range);
static_assert( ranges::forward_range);

ris random_access_range,所以 C++20 等约束算法ranges::binary_search可以使用这个 trait 对其执行更高效的操作,但是为了让旧std算法能够应用它,我们需要使用views::common将其转换为common_range. 但是,它也退化为 a forward_range,从而降低了算法的效率。

为什么标准只定义common_iteratorforward_iterator最多?这背后有何考虑?

回答

如果您有一个非通用范围的迭代器,并且需要将其转换为通用范围,那么您基本上有两种选择。

您可以通过连续递增开始迭代器直到它等于哨兵来计算结束迭代器是什么,或者您可以做一些技巧。common_iterator是为后者

这很重要,因为连续递增开始迭代器有两个缺陷。首先,如果它不是至少一个前锋范围,你就不能这样做。其次......如果范围是无限的会发生什么?因为那是 C++20 范围内的事情。事实上,这种可能性是我们拥有哨兵类型的最重要原因之一。

那么诡计多端。然而,在这种情况下,“诡计”意味着创建一个新的迭代器类型,用于开始和哨兵。因此,它必须同时具有这两者的局限性。哨兵基本上必须假装它是一个迭代器。

迭代器可以递增;哨兵不能。但是,无论如何都不允许增加范围的结束迭代器,因此您可以假装common_iterator允许增加结束。同样,您不能取消引用哨兵,但也不能取消引用结束迭代器。所以它可以假装它可以被取消引用,即使没有算法会这样做。

这意味着对于前向范围,除了针对某个其他迭代器测试结束迭代器之外,您不能做任何事情。简而言之,对于前向范围,结束迭代器也可能是一个哨兵。

但对于更高级别的范围,情况并非如此。明确允许采用双向范围的算法将结束迭代器向后移动。但是你不能对假装它是迭代器的哨兵这样做。

这就是为什么common_iterator范围不能高于前向范围的原因。






推荐阅读
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在 `UITableViewController` 中采用简洁的平面样式布局时,可以通过优化代码实现单元格扩展至屏幕边缘的效果,同时确保节标题以分组样式呈现,从而提升用户体验和界面美观度。通过这种方式,可以更好地组织和展示列表内容,使其更加清晰和有序。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
author-avatar
老猫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有