如何检查传递的迭代器是否是随机访问迭代器?

2024-03-26

我有以下代码,它执行一些迭代器算术:

template<class Iterator>
void Foo(Iterator first, Iterator last) {
  typedef typename Iterator::value_type Value;
  std::vector<Value> vec;
  vec.resize(last - first);
  // ...
}

The (last - first)表达式仅适用于随机访问迭代器(例如来自vector and deque)。如何在代码中检查传递的迭代器是否满足此要求?


If Iterator是一个随机访问迭代器,那么

std::iterator_traits<Iterator>::iterator_category

will be std::random_access_iterator_tag。实现这一点的最干净的方法可能是创建第二个函数模板并具有Foo叫它:

template <typename Iterator>
void FooImpl(Iterator first, Iterator last, std::random_access_iterator_tag) { 
    // ...
}

template <typename Iterator>
void Foo(Iterator first, Iterator last) {
    typedef typename std::iterator_traits<Iterator>::iterator_category category;
    return FooImpl(first, last, category());
}

这样做的好处是可以超载FooImpl如果您愿意,可以使用不同类别的迭代器。

斯科特·迈耶斯 (Scott Meyers) 在其中一篇文章中讨论了这项技术有效的C++书(我不记得是哪一本了)。

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

如何检查传递的迭代器是否是随机访问迭代器? 的相关文章

随机推荐

  • 了解涉及用户定义转换的重载解析排名

    我试图理解过载解析 首先让我们考虑第一种情况 struct int1 int val operator int return val operator const int const return val void f int f 1 vo
  • 我可以在 onExit 中停止到下一个状态的转换吗?

    我有两个状态 A和B 当我通过单击关闭按钮退出状态 A 时 我使用 state go 转换到屏幕 A 到状态 B 屏幕 B 当我通过单击屏幕 A 上的后退浏览器按钮退出状态 A 时 随着浏览器 URL 的更改 我会转换到状态 B 屏幕 B
  • Concourse 将文件添加到 docker 镜像一次

    我正在使用 concourse 作为我们的构建系统 Concourse 会缓存 docker 镜像 这样我们就不需要在后续运行中每次都经历下载过程 我想将一个二进制文件添加到将从互联网提取的 docker 映像中 但我只想在第一次由 con
  • 以编程方式向表情符号添加肤色修改器

    我在向应用程序中的表情符号添加肤色修改器时遇到一些问题 例如 如果我使用 let text 打印出来了 但是 对于其他表情符号则不起作用 例如 let text 打印 向表情符号添加肤色修改器的正确方法是什么 仅当前面的字符是纯表情符号字符
  • 命名空间“UnityEngine”中不存在类型或命名空间名称“UI”

    我正在为初学者做一个小课程Unity 3D here https learn unity com project john lemon s haunted jaunt 3d beginner 从统一资产商店导入所有资产后 如课程中所述 我收
  • Azure 逻辑应用程序,解析 JSON,但可能为 null

    我想根据以下类解析 json public class DerModel public string Name get set public string Email get set public class DriverPositiveR
  • 通过单击行获取 HTML 表格单元格值

    如何获取 HTML 表格中的 TD 值 i e ID cell 1 cell 2 1 aaaa a2a2a2 2 bbbb b2b2b2 3 cccc c2c2c2 所以现在如果我单击单元格值 bbbb 我想获取所选行的所有值 id 2 c
  • SFINAE 模板专业化优先级

    include
  • 在 Bootstrap 3 模式中使用 jQuery DatePicker

    我想用jQuery UI 日期选择器在模态中 真正的问题是 如果我还想显示年份和月份 它会显示空选择 使用firebug 选项标签似乎位于模态下 这是我的 HTML div class modal dialog div class moda
  • iPhone UIActionSheet 自动旋转不起作用

    我读了很多相关内容 人们说 当其父级未设置为自动旋转时 它不会自动旋转 我尝试了一切但没有运气 我创建了基于视图的应用程序 v4 2 并带有一个执行此操作的按钮 UIActionSheet actionSheet UIActionSheet
  • 使用 BeautifulSoup 和 Requests 抓取多个分页链接

    Python 初学者在这里 我正在尝试从以下位置抓取所有产品dabs com 上的一个类别 http www dabs com category computing 11001 我已经设法抓取给定页面上的所有产品 但在迭代所有分页链接时遇到
  • 如何从 TreeExplainer 获取 shap_values 的特征名称?

    我正在做一个 shap 教程 并尝试获取数据集中每个人的 shap 值 from sklearn model selection import train test split import xgboost import shap impo
  • Hadoop 2.2.0 配置弃用

    我设置了 Hadoop 2 2 0 集群 现在运行我的 java 客户端来处理数据 运行我的 java 程序后 我注意到输出显示如下 13 11 18 11 44 44 INFO Configuration deprecation user
  • 理解“排序!”块

    现在我有一个数组 letter a b c a b c a b b 有人可以解释一下以下返回值吗 letter sort x letter count x gt b b a c c a b b a 当你定义一个sort or sort 阻止
  • 如何自定义 Flask admin QuerySelectMultipleField 选择?

    我在用flask admin允许管理员用户访问数据库 其中呈现一对多关系 编辑条目时 我希望下拉菜单仅显示满足条件的选项 我虽然query factory可以做到这一点 以下是我现在拥有的最小示例 class OneSideObj db M
  • 如何在L2E或EF中使用外键?

    我有一个User表有一个PrivilegeId外键指向aPrivilege表 并且是那里的主键 在Entity Framework中 VS不会生成PrivilegeId下的变量User为你 它将生成一个Privilege财产和Privile
  • 何时使用 numpy 与统计模块

    在使用一些统计分析工具时 我发现至少有 3 种 Python 方法可以计算平均值和标准差 不包括 自己动手 技术 np mean np std ddof 0 或 1 statistics mean statistics pstdev 和 或
  • 如何使 Visual Studio 立即窗口提供纯字符串输出?

    如果我在 Immediate 中评估生成长而复杂的字符串的内容 则调试器会对 C 字符串转义中的所有内容进行编码 因此我最终会得到一团乱麻 n t等等 然后我必须手动修复整个文本 这在以下情况下尤其令人烦恼 n 因为大多数文本编辑器无法进行
  • TinyXML:将文档保存为 char * 或字符串

    我尝试使用 TinyXML 从内存中读取和保存 而不是仅读取文件并将其保存到磁盘 看来文档的解析函数可以加载一个char 但是当我完成后 我需要将文档保存到 char 中 有人知道这件事吗 编辑 打印和流媒体功能不是我想要的 它们以可视格式
  • 如何检查传递的迭代器是否是随机访问迭代器?

    我有以下代码 它执行一些迭代器算术 template