- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
STL 容器有一个模板参数可以选择自定义分配器。花了一段时间,但我想我明白它是如何工作的。不知何故,它并不是很好,因为给定的分配器类型没有直接使用,而是反弹到另一种类型的分配器。我终于可以使用它了。
看完API我认识到也有可能将分配器作为构造函数参数。但是,如果容器在内部从模板参数重新绑定(bind)给定的分配器,我怎么知道容器使用哪种分配器?
此外,我读到 C++11 现在使用范围分配器,它允许将容器的分配器重用于其包含的容器。启用了作用域分配器的容器的实现与不知道作用域容器的容器的实现有何不同?
很遗憾,我找不到任何可以解释这一点的东西。感谢您的回答!
最佳答案
But how do I know which kind of allocator the container uses, if it internally rebinds the given allocator from the template parameter?
始终提供 Allocator<T>
到构造函数(其中 T
是容器的 value_type
)。容器会将其转换为 Allocator<U>
在 U
的情况下是必需的是容器的一些内部数据结构。 Allocator
需要提供这样的转换构造函数,例如:
template <class T> class allocator {
...
template <class U> allocator(const allocator<U>&);
Additionally I read that C++11 now uses scoped allocators which allow to reuse the allocator of a container for its containing containers.
嗯,更准确地说,C++11 有一个名为 scoped_allocator_adaptor
的 分配器适配器 :
template <class OuterAlloc, class... InnerAllocs>
class scoped_allocator_adaptor : public OuterAlloc
{
...
};
来自 C++11:
The class template
scoped_allocator_adaptor
is an allocator template that specifies the memory resource (the outer allocator) to be used by a container (as any other allocator does) and also specifies an inner allocator resource to be passed to the constructor of every element within the container. This adaptor is instantiated with one outer and zero or more inner allocator types. If instantiated with only one alloca- tor type, the inner allocator becomes thescoped_allocator_adaptor
itself, thus using the same allocator resource for the container and every element within the container and, if the elements themselves are con- tainers, each of their elements recursively. If instantiated with more than one allocator, the first allocator is the outer allocator for use by the container, the second allocator is passed to the constructors of the container’s elements, and, if the elements themselves are containers, the third allocator is passed to the elements’ elements, and so on. If containers are nested to a depth greater than the number of allocators, the last allocator is used repeatedly, as in the single-allocator case, for any remaining recursions. [Note: Thescoped_allocator_adaptor
is derived from the outer allocator type so it can be substituted for the outer allocator type in most expressions. — end note ]
因此,如果您指定 scoped_allocator_adaptor
,您只会获得作用域分配器行为。作为容器的分配器。
How does the implementation of a scoped allocator enabled container roughly differs from one that is not aware of scoped containers?
关键是容器现在通过一个名为 allocator_traits
的新类来处理它的分配器。而不是直接处理分配器。并且容器必须使用allocator_traits
对于某些操作,例如构造和破坏value_type
s 在容器中。容器不得直接与分配器对话。
例如,分配器可以提供一个名为 construct
的成员这将使用给定的参数在某个地址构造一个类型:
template <class T> class Allocator {
...
template<class U, class... Args>
void construct(U* p, Args&&... args);
};
如果分配器不提供此成员,allocator_traits
将提供默认实现。无论如何,容器必须构造所有value_type
s 使用这个 construct
函数,但通过 allocator_traits
使用它,而不是使用 allocator
直接:
allocator_traits<allocator_type>::construct(the_allocator, *ugly details*);
scoped_allocator_adaptor
提供定制construct
allocator_traits
的函数将转发到哪个利用uses_allocator
特征并将正确的分配器传递给 value_type
构造函数。容器仍然对这些细节一无所知。容器只需要知道它必须构造value_type
使用 allocator_traits construct
功能。
容器必须处理更多细节才能正确处理有状态分配器。虽然这些细节也是通过让容器不做任何假设而是通过allocator_traits
获取所有属性和行为来处理的。 .容器甚至不能假设 pointer
是 T*
.而是通过询问 allocator_traits
找到这种类型。它是什么。
简而言之,要构建一个 C++11 容器,请学习 allocator_traits
.然后,当您的客户使用 scoped_allocator_adaptor
时,您将免费获得作用域分配器行为。 .
关于c++ - STL 容器 : Constructor's Allocator parameter and scoped allocators,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556638/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
我搜索了很多,但没有一个链接能帮助我解决这个问题。我得到了 ORA-21500: internal error code, arguments: [%s], [%s], [%s], [%s], [%s
我正在做 RegexOne 正则表达式教程,它有一个 question关于编写正则表达式以删除不必要的空格。 教程中提供的解决方案是 We can just skip all the starting
([\s\S]+|\s?) 中 |\s? 的目的或作用是什么?如果没有它,表达式会不会与 ([\s\S]+) 相同? 最佳答案 这不是完全相同的。 ([\s\S]+|\s?) 会匹配空字符串,而 ([
这个正则表达式有一组还是两组? 我正在尝试使用第二组访问 bookTitle 但出现错误: Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+
在 C 中给定一个字符串指针 s,下面的迭代会做什么?即它以什么方式遍历字符串? for (++s ; *s; ++s); 最佳答案 for (++s ; *s;++s) 表示 将指针 s 递增到字符
我正在用一个 node.js 应用程序解析一个大列表并有这段代码 sizeCode = dbfr.CN_DESC.split('\s+-\s*|\s*-\s+') 这似乎不起作用,因为它返回了 [ '
我正在编写一个简单的字符串连接程序。 该程序按照我发布的方式运行。但是,我首先使用以下代码编写它来查找字符串的结尾: while (*s++) ; 但是,这个方法并没有奏效。我传递给它的字符串
这个问题已经有答案了: What does (?和aramchand来自Mohandas Karamchand G 因此,在使用这些匹配来分割字符串后,您最终会得到 {"M", "K", "G"} 注
我正在尝试转换 Map到 List使用 lambda。 本质上,我想将键和值与 '=' 连接起来之间。这看起来微不足道,但我找不到如何去做。 例如 Map map = new HashMap<>();
我正在经历 K & R,并且在递增指针时遇到困难。练习 5.3(第 107 页)要求您使用指针编写一个 strcat 函数。 在伪代码中,该函数执行以下操作: 将 2 个字符串作为输入。 找到字符串
在下面的代码中,pS 和 s.pS 在最后一行是否保证相等?也就是说,在语句S s = S();中,是否可以确定不会构造一个临时的S? #include using namespace std; s
演示示例代码: public void ReverseString(char[] s) { for(int i = 0, j = s.Length-1; i < j; i++, j--){
我一直在寻找类似于 .NET examples 中的示例的 PowerShell 脚本.取一个 New-TimeSpan 并显示为 1 天 2 小时 3 分钟 4 秒。排除其零的地方,在需要的地方添加
def func(s): s = s + " is corrected" return s string_list = ["She", "He"] for s in string_li
我是 python 的新手。当我在互联网上搜索 lambda 时。我在 lambda_functions 中找到了这个声明. processFunc = collapse and (lambda s:
我最近开始学习正则表达式,并试图为上面的问题写一个正则表达式。如果限制只放在一个字母上(例如不超过 2 个“b”),这并不困难。 那么答案就是:a* c*(b|ε)a* c*(b|ε)a* c* 但是
当我运行 npm install 时出现以下错误,但我无法修复它。 我试过:npm install -g windows-build-tools 也没有修复这个错误 ERR! configure
有很多有趣的haskell网上可以找到片段。 This post可以在 this (awesome) Stack Overflow question 下找到. The author写道: discou
我知道以下三行代码旨在将字符串提取到$ value中并将其存储在$ header中。但是我不知道$value =~ s/^\s+//;和$value =~ s/\s+$//;之间有什么区别。 $val
我是一名优秀的程序员,十分优秀!