STL容器:构造函数的分配器参数和作用域分配器

2024-06-26

STL 容器有一个模板参数来选择自定义分配器。花了一段时间,但我想我明白它是如何工作的。不知怎的,这并不是很好,因为给定的分配器类型不直接使用,而是反弹到另一种类型的分配器。我终于可以使用它了。

读完后API http://en.cppreference.com/w/cpp/container/vector/vector我认识到也可以将分配器作为构造函数参数。但是,如果容器在内部从模板参数重新绑定给定的分配器,我如何知道容器使用哪种分配器?

另外,我读到 C++11 现在使用作用域分配器,允许为其包含的容器重用容器的分配器。启用作用域分配器的容器的实现与不支持作用域分配器的容器的实现有何大致不同?

不幸的是我找不到任何可以解释这一点的东西。感谢您的解答!


但是我如何知道容器使用哪种分配器(如果它) 在内部从模板参数重新绑定给定的分配器?

始终提供一个Allocator<T>到构造函数(其中T is the value_type容器)。容器会将其转换为Allocator<U>是必要的地方U是容器的一些内部数据结构。这Allocator需要提供此类转换构造函数,例如:

template <class T> class allocator {
    ...
    template <class U> allocator(const allocator<U>&);

另外,我读到 C++11 现在使用作用域分配器,它允许 为其包含的容器重用容器的分配器。

嗯,更准确地说,C++11 有一个分配器适配器 called scoped_allocator_adaptor:

template <class OuterAlloc, class... InnerAllocs>
class scoped_allocator_adaptor : public OuterAlloc
{
    ...
};

从 C++11 开始:

类模板scoped_allocator_adaptor是一个分配器模板 指定要使用的内存资源(外部分配器) 一个容器(与任何其他分配器一样),并且还指定一个内部 分配器资源将传递给每个元素的构造函数 容器内。该适配器是用一个外部实例化的 零个或多个内部分配器类型。如果仅用一个实例化 分配器类型,内部分配器变成scoped_allocator_adaptor本身,因此使用相同的分配器 容器和容器内每个元素的资源, 如果元素本身是容器,则它们的每个元素 递归地。如果使用多个分配器实例化,则第一个分配器 allocator 是容器使用的外部分配器,第二个 分配器被传递给容器元素的构造函数, 并且,如果元素本身是容器,则第三个分配器是 传递给元素的元素,依此类推。如果容器是嵌套的 深度大于分配器数量,最后一个分配器 被重复使用,就像在单分配器的情况下一样,对于任何剩余的 递归。 [Note: The scoped_allocator_adaptor是从 外部分配器类型,因此可以替换外部分配器 输入大多数表达式。 —end note ]

因此,如果您指定了一个,您只能获得范围分配器的行为scoped_allocator_adaptor作为容器的分配器。

启用作用域分配器的容器是如何实现的 与不知道作用域容器的容器大致不同?

关键是容器现在通过一个名为的新类处理其分配器allocator_traits而不是直接处理分配器。还有容器must use allocator_traits对于某些操作,例如构建和销毁value_types 在容器中。容器must not直接与分配器交谈。

例如,分配器may提供一个名为construct它将使用给定的参数在某个地址构造一个类型:

template <class T> class Allocator {
     ...
    template<class U, class... Args>
        void construct(U* p, Args&&... args);
};

如果分配器不提供该成员,allocator_traits将提供默认实现。无论如何,容器must构建所有value_type正在使用这个construct功能,但通过使用它allocator_traits,并且不使用allocator直接地:

allocator_traits<allocator_type>::construct(the_allocator, *ugly details*);

The scoped_allocator_adaptor提供定制construct函数其中allocator_traits将转发到利用uses_allocator特征并将正确的分配器传递给value_type构造函数。容器仍然对这些细节一无所知。容器只需要知道它必须构造value_type使用allocator_traits construct功能。

容器必须处理更多细节才能正确处理有状态分配器。尽管这些细节也是通过让容器不做任何假设而是通过获取所有属性和行为来处理的allocator_traits。容器甚至不能假设pointer is T*。相反,这种类型是通过询问找到的allocator_traits这是什么。

简而言之,要构建 C++11 容器,请研究allocator_traits。然后,当您的客户使用scoped_allocator_adaptor.

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

STL容器:构造函数的分配器参数和作用域分配器 的相关文章

  • 使用可加载内核模块修改帧缓冲区(/dev/graphics/fb0)参数

    Problem 我必须配置 Android 平台使用的各种 LCD 显示器 几乎在所有情况下 都没有针对感兴趣的 LCD 显示器免费提供的电气规格 但通过经验和逆向工程 可以很好地猜测参数 我正在尝试使用可加载内核模块来微调显示参数 也欢迎
  • 如何使用 LINQ ForEach 更改 List

    我有一个List
  • 以 ISO 8601 格式输出日期

    如何在 C 中获取以下格式的日期 2016 04 26T19 50 48Z include
  • MVC。网络错误:初始化字符串的格式不符合从索引 0 开始的规范

    我的连接字符串是
  • 求 a 范围内的 pow(a^b)modN

    对于给定的b and N以及一系列a say 0 n 我需要找到ans 0 n 1 where ans i 没有a s为此pow a b modN i 我在这里搜索的是可能的重复pow a b modN对于一系列a 以减少计算时间 例子 i
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • 获取当前用户的 NetworkCredential (C#)

    我正在尝试从控制台应用程序调用 Web 服务 并且我需要向客户端提供System Net NetworkCredential object 是否有可能创建一个NetworkCredential启动应用程序的用户的对象而不提示输入用户名 密码
  • 在 2 个 .c 文件之间共享函数

    dir1有dir2 file1 c和file1 h dir2 有 file2 c 现在 如果我想在 file2 c 中访问 file1 c 中定义的函数 我需要在 file1 h 中声明它并在 file2 c 中包含 file1 h 这是一
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • 运行时两个注册之间的简单注入器基于动态上下文的注入

    我有一个使用 Simple Injector 进行命令处理程序注册的中介应用程序 并且注入和处理程序均已设置并完美运行 class DoWashingCommandHandler IRequestHandler
  • 多态性中基类缺少虚拟析构函数 = 资源泄漏?

    我们知道 如果要多态地使用基类 则需要将基类的析构函数指定为 virtual 否则程序中可能会出现资源泄漏 因为只会调用基类析构函数 而不会调用派生对象析构函数 我们还知道构造函数 析构函数纯粹是初始化 未初始化构造 而operator n
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • 解析通过asp:FileUpload上传的XML文件

    我有一个场景 用户将上传 XML 文件 我想将该文件添加到数据库中的表中 不过 困难的部分是我需要解析文件 然后将一些信息添加到一些不同的表中 显示如何获取 XML 文件的每个示例都使用 URI 来获取文件 但是如何直接从数据库获取文件 或
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 没有类型的 IEnumerable 属性

    我正在尝试创建一个类似于来自 MSDN 的官方 DataGrid ItemsSource 的属性 public IEnumerable ItemsSource get set 这提供了对任何派生类中任何类型的支持 有了这个 我可以设置类似的
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn

随机推荐

  • 安装 mysql2 时出错:无法构建 gem 本机扩展

    我在尝试安装时遇到一些问题mysql2Rails 的宝石 当我尝试通过运行安装它时bundle install or gem install mysql2它给了我以下错误 安装 mysql2 时出错 错误 无法构建 gem 本机扩展 我该如
  • 如何在没有 sudo 的情况下安装 gem

    在我所有的 gem 安装中 我必须执行 sudo 所以 sudo gem 安装rails 会起作用 而只有 宝石安装导轨 不管用 我该如何补救 我安装了rvm murtaza murtaza dev which rvm home murta
  • 无法运行 ActionBarSherlock

    我有一个 2 2 android 项目 我想添加 ActionBarSherlock 当我运行我的项目时 我收到此错误 C Users vitaly Downloads ActionBarSherlock 4 2 0 ActionBarSh
  • 如何检测角度7中的url变化包括参数和查询参数

    我需要检测一个组件中路径参数和查询参数的 url 更改 path category key component CollectionPageComponent 最后的网址将是例如类别 T恤 or 类别 T 恤 页 2我需要根据类别获取所有产
  • 使用 lombok 注释继承出现错误

    在我的项目中 lombok 用于避免为类编写 getter 和 setter 我有两节课Child延伸Parent Value Builder AllArgsConstructor JsonIgnoreProperties ignoreUn
  • Laravel 5 错误处理

    我正在使用 Laravel 5 并且正在尝试制作自定义 404 页面和自定义异常处理 但我不知道将代码放在哪里 前段时间有一个 ErrorServiceProvider 不再存在 有人能给我一些指点吗 编辑 我看到他们在 App Excep
  • Flask-SQLAlchemy 构造函数

    在 Flask SQLAlchemy 教程中 定义了 User 模型的构造函数 from flask import Flask from flask ext sqlalchemy import SQLAlchemy app Flask na
  • Android 使用键盘上的“完成”按钮来单击按钮

    好的 在我的应用程序中 我有一个供用户输入数字的字段 我已将该字段设置为仅接受数字 当用户单击该字段时 它会弹出键盘 键盘 ICS 上 上有一个完成按钮 我希望键盘上的完成按钮能够触发我的应用程序中的提交按钮 我的代码如下 package
  • Entity Framework 5 Code First - 如何“重新开始”?

    我一直在我的应用程序中成功使用 EF 5 Code First 我大约有40张桌子 但是 我遇到了一个问题 我似乎可以正确处理迁移 所以 我想做的就是以某种方式告诉 EF 将数据库的当前模式视为一个新的起点 并从这个点开始管理它 这样 我可
  • 检查输出是否重定向

    我有一个用 C 编写的控制台应用程序 它处理一些数据然后打印结果 在结果可用之前 会有一个小动画 和不断更新的进度百分比 xx 显然 如果用户重定向我的应用程序的输出 这将被打印到输出重定向到的文本文件中 如果可能的话我想避免这种情况 那么
  • C++ 17 编译器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有可以运行 C 17 代码的在线地方 因为我想学习新功能 https github com Anth
  • R 中具有 NA 值的聚合栅格

    我在 R 中有一个分辨率为 1 公里的栅格 其 NA 值分布广泛 但位置不规则 即 包含数据的单元格不连续 并且 NA 值分散 我正在尝试使用用户定义的平均圆角函数 包括在下面 以 5 公里分辨率 因子 5 聚合此栅格 使用 raster
  • “代理人没有身份”是什么意思?

    我成功关注了这些说明 https help github com articles generating ssh keys 来自 GitHub 关于如何生成 SSH 密钥的信息 我与 GitHub 的连接成功 但是当我稍后想检查我的 SSH
  • 将互操作颜色转换为 System.Drawing.Color

    我正在寻找如何在 C 中将 Microsoft Office Interop Word Excel PowerPoint Color 转换为 System Drawing Color 我在这个论坛发现了相反的情况here https sta
  • 椭圆形留下痕迹

    我正在尝试制作一个简单的球动画 从面板的一个角开始到另一个角 我为此编写了一个程序 当我运行程序时oval or ball留下踪迹 我的意思是说 当程序运行时 它会留下 颜色痕迹 在我的程序中timer每 100 毫秒触发一个事件 以下是负
  • “伊甸园空间”的名字起源于垃圾收集

    在垃圾收集术语中 为什么它被称为 伊甸园空间 就这样 我还在熟悉这个术语 我不明白为什么它有这样的名字 伊甸园空间是创建对象的地方 他们的生活都很幸福 但最终他们被小天使赶到了年轻一代和老一代的荒野中 他们永远不会被允许回到伊甸园空间 他们
  • Python中Shift和Caps Lock的状态

    我正在使用 Python 2 5 编写 TkInter 应用程序 我需要找出大写锁定和 Shift 键的状态 true 或 false 我在整个网络上进行了搜索 但找不到解决方案 Tkinter 中的键盘事件可能很棘手 我建议您按顺序查看以
  • 在 python 中更改函数的 __qualname__ 时会发生什么?

    为了能够pickle嵌套函数 用于多重处理 我用装饰器装饰了嵌套函数 def globalize one func def wrapper one args kwargs return func args kwargs setattr mo
  • Window Defender 想要重置您的设置”-ChromeDriver 2.29 问题:Chrome 浏览器以新选项卡打开

    Chrome Browser open up with a new Tab asking for Window defender wants to reset your setting 请帮我解决这个问题 这发生在 chrome v 57
  • STL容器:构造函数的分配器参数和作用域分配器

    STL 容器有一个模板参数来选择自定义分配器 花了一段时间 但我想我明白它是如何工作的 不知怎的 这并不是很好 因为给定的分配器类型不直接使用 而是反弹到另一种类型的分配器 我终于可以使用它了 读完后API http en cpprefer