C++ STL应用与实现1: STL概览和分类

Posted elloop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ STL应用与实现1: STL概览和分类相关的知识,希望对你有一定的参考价值。

本系列文章的目录在这里:目录. 通过目录里可以对STL总体有个大概了解

前言

本文从整体上对STL的内容和功能做了一个概览,并根据其组成部分功能的不同对STL的组件进行分类。

在后续的文章中会对每个分类中的组件进行展开说明。

容器-container

1. 序列式容器(sequence containers)

  • array(since c++11) : 定长数组, 编译时确定长度,对内置数组[]的封装,让其可以当做标准容器来使用. 也可以被当做tuple.

  • vector : 动态数组, 较array,容量可扩展、缩小. 随机访问,顺序存储。插入删除较链表低效.

  • vector<bool> : vector的bool特化版本,优化存储空间占用.

  • forward_list(since c++11) : 单链表, 纯粹从效率角度设计,甚至没有size函数,较list占用存储空间小,插入删除也略快.

  • list : 双向链表, 较list,可双向遍历,较顺序存储容器,插入删除效率更高.

  • deque : 双端动态数组, 较vector,支持push_front(), pop_front()

2. 关联式容器(associative containers)

3. 哈希表(hash table) (since c++11)

4. 容器适配器(container adapters)

迭代器-iterator

迭代器是一种表示容器位置信息的对象。

前向迭代器 (forward iterator) : forward_list::iterator, unorderd associative containers at least support forward iterator.

双向迭代器 (bidirectional iterator) : iterators of list , set, multiset, map, multimap.

随机迭代器 (random-access iterator) : iterators of vector, deque, array, strings.

迭代器辅助函数

迭代器适配器

算法-algorithm

非变动类算法(nonmodifying algorithms)

变动类算法(modifying algorithms)

移除类算法(removing algorithms)

变序类算法(mutating algorithms)

排序类算法(sorting algorithms)

已序区间类算法(sorted range algorithms)

数值类算法(numerci algorithms)

函数对象-function objects (or functors for short)

预定义函数对象 (predefined function objects)

ExpressionActions
negate<T>()-arg
plus<T>()arg1 + arg2
minus<T>()arg1 - arg2
multiplies<T>()arg1 * arg2
divides<T>()arg1 / arg2
modulus<T>()arg1 % arg2
equal_to<T>()arg1 == arg2
not_equal_to<T>()arg1 != arg2
less<T>()arg1 < arg2
greater<T>()arg1 > arg2
less_equal<T>()arg1 <= arg2
greater_equal<T>()arg1 >= arg2
logical_not<T>()!arg1
logical_and<T>()arg1 && arg2
logical_or<T>()arg1
bit_and<T>()arg1 & arg2
bit_or<T>()arg1
bit_xor<T>()arg1 ^ arg2

函数组合的概念 (concept of functional composition) (according to the composite pattern in [GoF: DesignPatterns])

函数组合是STL灵活性的体现,通过函数适配器,我们可以把各种预定义functors,自定义functors,全局函数,成员函数,lambda表达式以及各种值组合起来使用.

函数适配器与Binders (function adapters)

ExpressionActions
bind(fn, args…)binds args to fn
mem_fn(fn)calls fn() as a member function for an obj or ptr of obj
not1(fn)unary negation: !fn(arg)
not2(fn)binary negation: !fn(arg1, arg2)

由于C++11推出了bind以及lambda表达式等强大特性, 这些特性使得函数组合操作更加方便,因此C++98中的一些用于实现函数组合的函数适配器已经deprecated. 它们包括:

ExpressionActions
bind1st(fn, arg)calls fn(arg, param), arg是bind1st里提供的数值,param是调用者传来的
bind2nd(fn, arg)calls fn(param, arg), arg是bind2nd里提供的数值,param是调用者传来的
ptr_fun(fn)calls *fn(param) or *fn(param1, param2), ptr_fun用来包装函数指针, 因为大多数标准库设施不直接支持函数指针
mem_fun(fn)calls fn() as a member function for a ptr to an obj
mem_fun_ref(fn)calls fn() as a member function for an obj
not1(fn)!fn(param)
not2(fn)!fn(param1, param2)

从C++11起,我们应该尽量多使用bind和lambda来与STL的其它组件协同完成开发任务,这样写出来的代码更好理解也便于维护。后面的文章中将对bind的用法、lambda的用法及限制等方面进行展开,同时给出这方面的代码示例。


作者水平有限,对相关知识的理解和总结难免有错误,还望给予指正,非常感谢!

欢迎访问github博客,与本站同步更新

以上是关于C++ STL应用与实现1: STL概览和分类的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL应用与实现95: 如何使用Allocator

C++ STL应用与实现95: 如何使用Allocator

C++ STL应用与实现目录

C++ STL应用与实现19: 迭代器特性-iterator traits

C++ STL应用与实现18: 如何使用迭代器适配器

C++ STL应用与实现22: 函数组合之1:如何使用std::bind (since C++11)