博客
关于我
STL-空间配置器一 (构造和析构)
阅读量:641 次
发布时间:2019-03-14

本文共 2265 字,大约阅读时间需要 7 分钟。

STL六大组件及空间配置器

在C++编程中,STL(标准板本.library, Standard Template Library)提供了许多强大的工具来辅助开发。其中,六大组件是STL的核心,任何复杂的应用开发都依赖于这些组件的有效运用。

1. 容器(containers)

容器类是STL最基本的工具,它们提供了各种数据结构来存储和操作数据。常见的容器包括:

  • vector:动态数组,内存连续,操作速度快。
  • list:双向链表,插入和删除操作高效,但迭代速度较慢。
  • deque:双端队列,支持高效的前驱和后驱操作。
  • set:有序集合,存储元素唯一且有序。
  • map:哈希表,记录键值对,并且可以保持有序。

这些容器从实现上看都是class template,允许它们支持任意类型的数据。

2. 算法(algorithms)

算法组件为容器提供了基本操作,如排序、查找等。常见算法包括:

  • sort:对容器中的元素进行排序。
  • search:查找特定元素。
  • copy:复制容器中的元素到另一个容器。
  • erase:从容器中删除特定元素。

这些算法都是function template,支持与任意容器进行操作。

3. 迭代器(iterators)

迭代器是容器与算法之间的桥梁,它提供了类似于指针的操作:

  • operator*: 通过迭代器获取当前元素。
  • operator->: 通过迭代器获取指针。
  • operator++: 前进到下一个元素。
  • operator--: 后退到前一个元素。

迭代器是一个class template,专门为不同的容器定义。

4. 仿函数(functors)

仿函数的行为类似于函数,可以作为算法的策略。常见的仿函数有:

  • less_than: 用于比较操作。
  • greater_than: 用于比较操作。
  • plus: 加法操作。
  • multiplies: 乘法操作。

这些仿函数都是class或class template,通过重载**operator()**实现。

5. 适配器(adapters)

适配器用于修饰容器或仿函数的接口,具体应用:

  • queue:基于deque实现,读写操作由底层容器管理。
  • stack:基于deque实现,操作也由底层容器处理。

适配器可以将一个类型转换为另一种类型的接口,支持更多的应用场景。

6. 配置器(allocator)

配置器负责内存的动态配置与管理。传统的内存配置使用newdelete,而STL将其分开:

  • construct(): 用于构造对象,支持placement new,例如:
    void* ptr = std::alloc();std::construct(ptr, object);
  • destroy(): 用于析构对象,例如:
    std::destroy(ptr, object);

配置器的目标是提高效率,将 :/内存分配和对象构造/分开处理,使得代码更加灵活和高效。

配置器的实现细节

在底层实现中,constructdestroy函数是通过placement newdestroy操作实现的。```cpptemplate <class _t1, class _t2>inline void construct(_t1* __p, const _t2& __value) {new(static_cast<void*>(__p)) _t1(__value);}template

inline void construct(_t1* __p) {new(static_cast<void*>(__p)) _t1();}template
inline void destroy(_Tp* __pointer) {__pointer->~_Tp();}

对于迭代器的版本:```cpptemplate 
inline void destroy(_ForwardIterator __first, _ForwardIterator __last) { _Destroy(__first, __last);}template
inline void _Destroy(_ForwardIterator __first, _ForwardIterator __last) { __destroy(__first, __last, __VALUE_TYPE(__first));}

此外,还有针对元素数值类型的判断:

template 
inline void __destroy(_ForwardIterator __first, _ForwardIterator __last, _Tp*) { typedef typename __type_traits<_Tp>::has_trivial_destructor _Trivial_destructor; __destroy_aux(__first, __last, _Trivial_destructor());}template
inline void __destroy_aux(_ForwardIterator, _ForwardIterator, __false_type) { for (; __first != __last; ++__first) { destroy(&*__first); }}

转载地址:http://hiwlz.baihongyu.com/

你可能感兴趣的文章
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIH发布包含10600张CT图像数据库 为AI算法测试铺路
查看>>
Nim游戏
查看>>
NIO ByteBuffer实现原理
查看>>
Nio ByteBuffer组件读写指针切换原理与常用方法
查看>>
NIO Selector实现原理
查看>>