首页 理论教育 程序员使用配置器进行实例化容器和组件

程序员使用配置器进行实例化容器和组件

时间:2023-10-25 理论教育 版权反馈
【摘要】:对于程序员而言,使用不同的配置器应该没有任何困难。例如,对于广大程序员而言,使用配置器可以实例化出容器和其他组件。例如实例化运用共享内存的配置器,或允许map的元素储存在持久性数据库中。配置器提供一个接口,用于分配、生成、销毁和回收对象。表14-1 基本的空间分配操作例如,对于最简单的vector实例方案,配置器被作为模板参数或构造器的函数传递给vector型容器,并保存在其内部。其构造函数也包含了配置器的内容。

程序员使用配置器进行实例化容器和组件

对于程序员而言,使用不同的配置器应该没有任何困难。在使用时,程序员仅需将配置器作为一个模板参数而已。例如,

使用特殊的配置器myAlloc,用于产生特殊的容器和strings:

978-7-111-51399-5-Chapter14-1.jpg

还可以自定义一些配置器,例如,

978-7-111-51399-5-Chapter14-2.jpg

使用非标准的配置器分配的对象表面上没有任何的问题,但是,由于不同的配置器分配的元素是不能混淆的,因此可能会造成未定义行为。运算符“operator==”可以用来比较两个配置器是否使用了相同的内存模型。如果返回true,表示一个内存配置器的储存空间可以由另一个配置器收回。“以配置器为模板参数”的型别会提供一个get_allocator()函数,由此可以获得对应的配置器。例如,

978-7-111-51399-5-Chapter14-3.jpg

对于广大程序员而言,使用配置器可以实例化出容器和其他组件。例如实例化运用共享内存的配置器,或允许map的元素储存在持久性数据库中。配置器提供一个接口,用于分配、生成、销毁和回收对象。通过配置器,容器和算法的元素存储方式才得以被参数化。基本的空间分配操作见表14-1。

14-1 基本的空间分配操作

978-7-111-51399-5-Chapter14-4.jpg

例如,对于最简单的vector实例方案,配置器被作为模板参数或构造器的函数传递给vector型容器,并保存在其内部。vector型容器的声明形式为(注意代码中的加黑字体):

978-7-111-51399-5-Chapter14-5.jpg

在vector型容器中,存在配置器类型的相关声明。其构造函数也包含了配置器的内容。

978-7-111-51399-5-Chapter14-6.jpg

上述第二个构造函数中的参数n代表元素个数,参数value代表数值。配置器是由函数allocator()产生的。

对于一些未初始化的内存,STL也提供了3个函数:uninitialized_fill()、uninitialized_fill_n()和uninitialized_copy()。这3个函数的使用较为方便。(www.xing528.com)

1)uninitialized_fill(beg,end,val)。该函数以数值val初始化[beg,end]中的元素。

2)uninitialized_fill_n(beg,num,val)。该函数以数值val初始化[beg,end]中的num个元素。

3)uninitialized_copy(beg,end,mem)。该函数以[beg,end]中的各个元素初始化mem为起始地址的各个元素。

例如,可以在构造器中添加以下代码:

978-7-111-51399-5-Chapter14-7.jpg

此外,对于原始存储区,其迭代器也是比较复杂的问题。C++STL提供了raw_storgae_iterator类,用于实现在未初始化的内存中访问并初始化。这样,使用该类定义的指针,即可使用任何算法。例如,

978-7-111-51399-5-Chapter14-8.jpg

模板raw_storage_iterator的第一个参数T应是一个对应元素型别的输出型迭代器;第二个参数必须是元素型别。

对于临时缓冲区,程序开发过程中可能经常使用以下两个函数:

978-7-111-51399-5-Chapter14-9.jpg

这两个函数可用来处理部分未初始化的内存,以便满足函数的短暂需求。

get_temporary_buffer()函数返回的内存容量可能会比预期的少一些,其返回值是pair类型,内含所获的内存地址和内存容量。例如,

978-7-111-51399-5-Chapter14-10.jpg

如果pair的second值为0,那么表示分配内存失败,即分配的容量为0;如果pair的second小于num,那么表示分配的内存不足够。pair的first包含被分配的内存地址,如果不为0,那么返回first的值,即返回了被分配的内存地址。

get_temporay_buffer()和return_temporary_buffer()函数现已使用得较少了,故此处不再赘述。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈