专门化 STL 算法,以便它们在可用时自动调用高效的容器成员函数

2024-04-28

STL 具有全局算法,可以在任意容器上运行,只要它们支持该算法的基本要求。例如,某些算法可能要求容器具有随机访问迭代器,例如向量而不是列表。

当容器具有比通用算法更快的执行方式时,它会提供具有相同名称的成员函数来实现相同的目标 - 就像提供自己的列表一样remove_if()因为它可以通过在恒定时间内执行指针操作来删除元素。

我的问题是 - 是否可以/建议专门化通用算法,以便它们自动调用更高效的容器的成员函数版本?例如。有std::remove_if call list::remove_if内部用于列表。这已经在STL中完成了吗?


不属于以下情况remove_if,因为语义不同。std::remove_if实际上并没有从容器中删除任何内容,而list::remove_if是的,所以你绝对不希望前者调用后者。

您和实现都无法从字面上专门化容器的通用算法,因为算法是采用迭代器的函数模板,而容器本身就是类模板,其迭代器类型取决于模板参数。所以为了专业化std::remove_if一般用于list<T>::iterator你需要一个partial专业化remove_if,并且不存在函数模板的部分特化之类的东西。

我不记得是否允许实现重载特定迭代器类型的算法,但即使不是“官方”算法也可以调用可以重载的函数,或者它可以使用可以部分专业化的类。不幸的是,如果您编写了自己的容器,并且发现了一种使标准算法对其特别有效的方法,那么这些技术都无法帮助您。

例如,假设您有一个带有随机访问迭代器的容器,但您有一个特别有效的排序技术,可以与标准排序一起使用:也许是桶排序。那么你可能会想到放一个自由函数template <typename T> void sort(MyContainer<T>::iterator first, MyContainer<T>::iterator last)与类位于同一名称空间中,并允许人们调用它using std::sort; sort(it1, it2);反而std::sort(it1, it2);。问题是,如果他们在通用代码中这样做,他们就会面临其他人编写其他容器类型将具有名为的函数的风险sort这甚至没有对范围进行排序(毕竟,英语单词“sort”有不止一种含义)。因此基本上您不能以提高用户定义容器效率的方式对迭代器范围进行一般排序。

当代码中的差异仅取决于迭代器的类别时(例如std::distance对于随机访问迭代器来说速度很快,否则速度很慢),这是使用称为“迭代器标签调度”的东西来完成的,这是不同容器之间存在明显效率差异的最常见情况。

如果还有任何适用于标准容器的情况(不包括结果不同或效率仅需要特定迭代器类别的情况),让我们拥有它们。

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

专门化 STL 算法,以便它们在可用时自动调用高效的容器成员函数 的相关文章

  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐

  • 无法启动 Android Studio 模拟器

    我正在使用 Android Studio 这是 Android 的新官方 IDE 我永远无法让模拟器运行 出现一个黑色的模拟器屏幕 其中包含闪烁的 android 一词 并且几分钟内没有任何变化 我已经等了30多分钟了 没有任何变化 我必须
  • 在元素的单击事件上添加类

    我是 Angular Js 的新手 我需要在元素的单击事件上添加一个类 我尝试了以下代码 但它不起作用 div p data na p div
  • 在 SQLite.swift 中找不到 SQLite/SQLite-Bridging.h

    我正在使用 SQLite swit https github com stephencelis SQLite swift https github com stephencelis SQLite swift 来开发应用程序 我按照 Pod
  • HTML 解析和删除锚标记,同时使用 Jsoup 保留内部 html

    我必须解析一些html并删除锚标记 但我需要保留锚标记的innerHTML 例如 如果我的 html 文本是 String html div p some text a href some link text a p div 现在我可以解析
  • 对“组件”类型的引用声明它是在“系统”中定义的

    尝试在 UWP 应用程序中获取一些 WMI 对象 在 net 4 6 上运行 VS2015 我收到 ForEach 和方法调用错误 指出 引用类型 组件 声明它是在 系统 中定义的 错误为 CS7069 using System using
  • 导入 pygame.font 失败

    import pygame对我来说效果很好 但是import pygame font失败并出现错误 ImportError dlopen Library Frameworks Python framework Versions 2 7 li
  • 如何使用 VS2010 在开发服务器上测试将 ASP.NET Web 应用程序作为 64 位进程运行?

    我的任务很简单 我需要在我的开发计算机上的 64 位环境中测试我的 ASP NET Web 应用程序 此时 我什至不询问如何通过调试器运行它 我所需要的只是在 64 位进程中运行它 因此 我在 Visual Studio 2010 中创建了
  • CSS 100% 高度布局

    我知道这是一个常见问题 我查找了一些解决方案 但找不到我想要的东西 我想转换this http pastehtml com view av6fb8bir html到无表布局 注意 页眉和页脚必须设置为固定高度 以像素为单位 50px 即可
  • mysql非空字段计数

    我想计算 mysql 中特定字段集有多少字段为空 我找到了一些示例 但它们都遍历整个表 基本上我有8个字段 listing photo 1 到listing photo 8 我想知道其中有多少个被填充 I tried result mysq
  • 哪些 .NET 依赖注入框架值得研究? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 不均匀圆盘的最佳覆盖

    What kind of algorithm can I use to search for an optimal minimum area covering of a limited region of the XY plane with
  • 嵌入式剃须刀视图

    最近 我读到一篇post http www chrisvandesteeg nl 2010 11 22 embedding pre compiled razor views in your dll 作者在其中描述了如何将 razor 视图编
  • Terraform如何在路由表中获取动态路由

    Terraform如何根据工作空间在路由表中获取动态路由 UAT resource aws vpn gateway micorsoft vpn gw vpc id aws vpc default id tags Name micorsoft
  • Vaadin - GWT 错误“模块 xxx 可能需要重新编译

    我正在加大 Vaadin 的力度 每当我尝试运行演示应用程序时 都会收到此 javascript 警报 GWT module com vaadin terminal gwt DefaultWidgetSet may need to be r
  • linux命令行:如何简单地将任意字符串输入管道?

    我正在寻找一个非常简单的技巧 假设文件中error txt 有一个很长的字符串 errorMessage key1 some message key2 message 2 由于它的格式不适合读者 如果我想在终端中以格式良好的形式查看它 我可
  • 如何在 WordPress 中调用 href 上的 PHP 函数?

    我有以下功能 我想在用户单击超链接 取消激活我的帐户 时调用此函数 在 href 点击上调用函数的最佳方式是什么 谢谢 function deleteUserMeta userID delete usermeta userID subscr
  • java中的new关键字是多余的吗?

    我来自 C 所以 java 的一个特性我不太理解 我读过所有对象都必须使用关键字创建new 但基元除外 现在 如果编译器可以识别原始类型 并且不允许您在不调用其构造函数的情况下创建对象new 有这个关键字的原因是什么new根本吗 有人可以提
  • 防止我的数据影响谷歌分析

    我最近推出了一个网站 并使用谷歌分析来跟踪流量和趋势 不幸的是 我喜欢和我的商业伙伴一起经常检查该网站 我们的数据正在影响我们的谷歌分析 有没有一种简单的方法可以使某些用户活动不会被谷歌分析跟踪 我正在考虑将另一个域名 或子域 附加到我的网
  • 提升 ggplot2 性能

    The ggplot2软件包无疑是我使用过的最好的绘图系统 只是对于较大的数据集 约 50k 点 来说性能并不是很好 我正在考虑通过 Shiny 提供网络分析 使用ggplot2作为绘图后端 但我对其性能并不满意 尤其是与基础图形相比 我的
  • 专门化 STL 算法,以便它们在可用时自动调用高效的容器成员函数

    STL 具有全局算法 可以在任意容器上运行 只要它们支持该算法的基本要求 例如 某些算法可能要求容器具有随机访问迭代器 例如向量而不是列表 当容器具有比通用算法更快的执行方式时 它会提供具有相同名称的成员函数来实现相同的目标 就像提供自己的