sgi_stl源码学习,官方文档1-3.2部分

目标:翻译sgi_stl官方说明文档为中文,配合侯捷的STL源码剖析和sgi_stl源码来学习。

概念说明:
STL=Standard Template Library
C++模板属于C++的子集,STL是C++模板的标准实现库。
C++的子集都是图灵完备的:纯C++、C++标准库、C++模板、C++预处理器、C、C++元编程……(此描述可能并不严谨)
STL有很多版本,HP惠普公司的sgi_stl被认为是写得比较好比较简洁的一个版本,所以被侯捷推荐用于学习STL。微软的STL据说比较晦涩难懂。

Sgi_stl官网可能移到这了:https://www.boost.org/sgi/stl/index.html
我本地有一份2000.6.8的版本,似乎与网上的一致。翻译按照网上的来,代码可能按照本地的来。

https://www.boost.org/sgi/stl/index.html
版权声明。主要的链接:STL简介、如何阅读本网站、目录、索引、类别索引、设计文档、版本说明、其他STL资源、FAQ、实验性质的IO库

https://www.boost.org/sgi/stl/stl_introduction.html
STL简介,分几大部分:容器container 、算法algorithms、迭代器iterators、仿函数functors、实用模块utilities、适配器adaptors、分配器allocators。
STL组件高度参数化。
容器container :vector, list, deque, set, multiset, map, multimap, hash_set, hash_multiset, hash_map, hash_multimap.
算法algorithms,操纵容器中的数据,例如反转reverse
迭代器iterators是使算法与容器分离成为可能的机制。C指针也是迭代器。
个人理解:容器、算法、迭代器,是对C语言中的数据结构、函数、指针的一次概念上的抽象、分解、隔离,使用的时候再组合。
C++之父Bjarne Stroustrup解释了设计模板的动机:独立的概念应该独立地表达,只在必要时才将它们组合起来。
本质上还是对应了图灵机纸带上的三件事:数据、操作、地址。

https://www.boost.org/sgi/stl/Container.html
容器
Associated types关联类型:值类型,必须Assignable,迭代器类型(const、非const)、应用类型、指针类型、距离类型(difference_type)、size_type。

容器类型必须定义这些函数:begin()end()size()max_size()bool empty()swap(b)
X(a); X b(a); b = a; a.~X()
c.empty()一般比c.size() == 0快。
典型容器vector

https://www.boost.org/sgi/stl/ForwardContainer.html
Forward Container 前向容器,顺序确定不会自发变化。元素支持EqualityComparable 、LessThanComparable、Assignable。
典型类:vector、list、slist、deque、set、hash_set、map、hash_map、multiset、hash_multiset、multimap、hash_multimap这些都是前向容器,都要求使用这些容器的类型支持==、<、>等比较函数,当然也要支持几种赋值。

https://www.boost.org/sgi/stl/ReversibleContainer.html
Reversible Container反向容器,也是一个前向容器、双向容器。定义了X::reverse_iterator、X::const_reverse_iterator。定义了函数a.rbegin()、a.rend()
典型类:vector、list、deque

https://www.boost.org/sgi/stl/RandomAccessContainer.html
Random Access Container随机访问容器,同时也是一个反向容器。定义a[n] 典型类:vector、deque

https://www.boost.org/sgi/stl/Sequence.html
Sequence 序列是一种可变大小的容器。可以再指定位置插入、删除、resize。类vector、list、slist、deque。

Front Insertion Sequence :类list、deque。函数a.front()a.push_front(t) a.pop_front()

Back Insertion Sequence:类vector、list、deque。函数a.back()a.push_back(t) a.pop_back()

Associative Container关联容器:类set、multiset、hash_set、hash_multiset、map、multimap、hash_map、hash_multimap。
Multiset允许重复、multimap允许一对多。

Simple Associative Containe简单关联:set、multiset、hash_set、hash_multiset。
Pair Associative Container配对关联:map、multimap、hash_map、hash_multimap。
Sorted Associative Container 有序关联:set、multiset、map、multimap。带hash的都没有顺序,但不影响set、map的概念,只是遍历时key没有顺序。
Hashed Associative Container:函数a.hash_funct()。类hash_set、hash_multiset、hash_map、hash_multimap。
Hash Function:STL定义了以下数据的hash值:char*、const char*、crope、wrope、char、signed char、unsigned char、short、unsigned short、int、unsigned int、long、unsigned long

Unique Associative Container唯一关联:set、hash_set、map、hash_map,没有重复的。
Multiple Associative Container有重复的multiset、hash_multiset、multimap、hash_multimap。

Unique Sorted Associative Container无重复、有序、关联:map、set
Multiple Sorted Associative Container:multiset、multimap
Unique Hashed Associative Container:hash_set hash_map
Multiple Hashed Associative Container:hash_multiset hash_multimap

Assignable是指:定义了拷贝构造函数X x(y)、赋值函数(X x=y)、值交换函数(swap(x,y))。找个标准的Assignable类,仿照着写即可,注意修饰符。遗漏了必要函数会导致编译不通过(除非没有用到,就不会模板实例化,进而不会报错)。
Default Constructible是指有默认构造函数的类X()。
EqualityComparable 是指定义了==、!=
LessThanComparable是指定义了 <、>、<=、>=

以上都是概念定义。实际每种概念对应了几个必须实现的函数、数据特征。

后面开始讲容器类
vector<T, Alloc >, Members范围实际在前面概念部分讲过。按照规范接口列表写即可。适合随机访问、顺序访问,不适合随机增删。
deque <T, Alloc >,主要比vector多了个push_front。
list <T, Alloc >链表,适合增删。
slist<T, Alloc >单链表
bit_vector ,vector < bool >,与vector接口一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值