为什么并行 for_each 需要前向迭代器?

2023-12-27

我正在设计一个遍历多个容器的迭代器,因此有一个代理对象作为返回类型。因此,它最多只能成为一个输入迭代器(这是因为前向迭代器需要reference是一个实际的引用类型,但据我所知,这对于输入迭代器来说并非如此)。

(让我说)简单for_each与我的迭代器一起工作就像一个魅力。
然而,当我查看它的并行版本时,我发现它只接受前向迭代器。因此,我无法使用返回代理对象的复杂迭代器,这很烦人。
另一方面,我在网上查看了其他著名的实现,这并不像我最初想象的那么常见 - 例如,英特尔 TBB 为每个接受输入迭代器的并行提供了自己的并行。

我的问题是:为什么并行不std::for_each使用输入迭代器?
我看不出它们是前向迭代器的意义,因为乍一看,即使使用输入迭代器,它也应该可以正常工作。我缺少什么?


由于您指出的原因,C++17 迭代器模型存在一个已知缺陷,即代理迭代器只能是输入迭代器。这有很多缺点。并行算法不需要非代理迭代器,但它们确实需要多通保证。当前的迭代器类别模型将两者混为一谈。

对于 C++20 范围,我们得到这样的想法iterator_concept http://eel.is/c++draft/iterator.concepts,这是一个向后兼容的填充程序,可以正确支持代理迭代器。你可以有一个iterator_category of input_iterator_tag but an iterator_concept of forward_iterator_tag, 例如。新的ForwardIterator http://eel.is/c++draft/iterator.concept.forward概念不看类别,而是看概念:

template<class I>
  concept ForwardIterator =
    InputIterator<I> &&
    DerivedFrom<ITER_CONCEPT(I), forward_iterator_tag> &&
    Incrementable<I> &&
    Sentinel<I, I>;

并行算法是否会改变是另一个我无法回答的问题。

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

为什么并行 for_each 需要前向迭代器? 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • Excel 工作簿的 R Download.File 问题

    我正在尝试使用 R 下载 Excel 工作簿下载文件 http stat ethz ch R manual R patched library utils html download file html功能 当我手动下载文件 使用 Inte
  • POI中如何判断文件是doc还是docx

    标题可能有点令人困惑 最简单的方法必须是通过扩展名来判断 如下所示 is represents the InputStream if filePath endsWith doc WordExtractor ex new WordExtrac
  • 显示:内联表

    IE 7 不支持display inline table 其他浏览器支持 对于替代解决方案我应该做什么 火狐和 IE8 支持display inline table IE6支持display inline table class inlin
  • 从 data.frame 到 ggplot2 图例的表达式

    我想向图例条目添加一个表达式 而不直接输入图例 因为我正在循环变量 本质上我想要这样 d lt data frame x 1 10 y 1 10 f rep c 0 74 gt 75 each 5 qplot x y data d colo
  • LoopBack:如何在代码中动态创建自定义 REST 端点(即时)

    我们使用 LoopBack REST 框架来公开我们的数据库 和业务逻辑 我们需要允许客户在数据库 单租户和多租户 中创建自定义表 这些表可以通过 REST 端点进行访问 所有客户都需要使用相同的通用 生产 REST 端点 这些端点将公开在
  • Flutter 是否支持 FieldPath?

    我找不到FieldPath in the cloud firestore颤振插件 https pub dartlang org packages cloud firestore但是 我认为这是一个非常常见的工具 将是此类插件的第一个实现之一
  • NativeScript WebView在默认浏览器中打开url

    我正在尝试构建应用程序WebView以及 WebView 内 URL 上的单击 点击事件 下面的解决方案打开外部浏览器和 URL 但它也在 webview 中加载相同的 url 内容 有没有办法阻止在 webview 中加载新的 url 这
  • 运行“npm install”时保留符号链接

    如果我们这样做 npm link x 然后我们跑npm install 它将覆盖符号链接包 有没有办法跑npm install不覆盖符号链接包 就像是 npm install preserve symlinks or npm install
  • 如何防止单击锚元素内的图像时的链接行为?

    我有一个与此类似的代码 a href link html goto link page img src images edit gif alt a 现在 如果您单击文本 我希望 href 链接能够正常工作 但是如果您单击图像 它应该执行其他
  • 在 Safari 中跳转输入字段

    我正在尝试重新创建一个非常酷的占位符用户界面 http dribbble com shots 1254439 GIF Mobile Form Interaction list users只使用 HTML 和 CSS 我就差不多明白了 dem
  • Vulkan 的 VkMemoryHeapFlagBits 是否缺少值?

    在 Vulkan 规范 1 0 9 第 180 页 中 我们有以下内容 typedef struct VkMemoryHeap VkDeviceSize size VkMemoryHeapFlags flags VkMemoryHeap 和
  • C# - 值类型的引用包装器

    我想用c Pointtype 作为引用类型 它是一个结构 我想到了上课CPoint 其中将包含一个Point成员 有什么办法可以提高会员人数吗 Point担任成员Cpoint 我正在努力避免 cpoint point X cpoint po
  • SQL Server 从表中读取 csv 二进制文件

    我目前将 csv 格式的文件存储在磁盘上 然后像这样查询它们 SELECT FROM OPENROWSET BULK C myfile csv FORMATFILE C format fmt FIRSTROW 2 AS rs 其中 form
  • javascript 中计数器变量的奇怪值[重复]

    这个问题在这里已经有答案了 可能的重复 Javascript 臭名昭著的循环问题 https stackoverflow com questions 1451009 javascript infamous loop problem 由于某种
  • Django 1.9:django.core.exceptions.AppRegistryNotReady:应用程序尚未加载

    我正在尝试使用这个应用程序https github com benliles django chance https github com benliles django chance在我的应用程序中 我的 Django 版本是 1 9 我
  • 底部对齐 R 闪亮按钮

    我无法找到底部对齐的方法downloadButton with a selectizeInput i e library shiny runApp list ui shinyUI fluidPage fluidRow align botto
  • 如何在Android上像instagram一样实现视频过滤器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要在我的 Android 应用程序中添加视频过滤器 例如Instagram 我搜索了很多 但没有找
  • 打印 HasMorePages 不起作用 c#

    好吧 所以我一直在四处寻找 在 SO 和 Google 上 看看一个问题是否可以解决我的错误 但显然不能 所以这里是 我正在尝试打印有时会超过一页的内容 并且我正在检查要打印的页数 检查完所有这些逻辑后 我使用HasMorePages属性来
  • 使用 JSlider 实时更新 jFreeChart 的透明度

    我想问这个问答问题的后续问题 JFreeChart 可见后如何更新其外观 https stackoverflow com questions 5522575 how can i update a jfreecharts appearance
  • 为什么并行 for_each 需要前向迭代器?

    我正在设计一个遍历多个容器的迭代器 因此有一个代理对象作为返回类型 因此 它最多只能成为一个输入迭代器 这是因为前向迭代器需要reference是一个实际的引用类型 但据我所知 这对于输入迭代器来说并非如此 让我说 简单for each与我