提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
SGI(Silicon Graphics, Inc.)版本的C++ STL(Standard Template Library)是C++标准模板库的一个经典实现,它由Alexander Stepanov和Meng Lee于1994年设计开发,并最初发布在SGI的IRIX操作系统上。SGI STL在很大程度上影响了后来C++标准中STL的设计和实现。
学习SGI版本的C++ STL可以帮助你深入理解STL的核心概念和数据结构,下面是一些学习重点:
提示:这里可以添加本文要记录的大概内容:
《STL源码剖析》是由侯捷所著,是一本经典的C++ STL源码解析书籍,它深入剖析SGI版本的C++ STL源代码,解释了STL各个组件的实现原理和设计思路。以下是该书第一章的重点概述:标准程序库(Standard Library):
介绍C++标准程序库的概念和组成部分,包括STL、I/O流、字符串处理、数值处理等组件。
强调STL是标准程序库中的一个重要组成部分,它为C++程序员提供了强大的泛型编程工具。
STL的优势:
简化代码:STL允许使用泛型编程,使得代码更加简洁、灵活且易于维护。
提高效率:STL中的算法和数据结构都经过高度优化,可以提高程序的执行效率。
高度可移植性:STL的实现是独立于具体平台的,因此代码可以在不同的编译器和操作系统上运行。
STL的组成:
容器(Containers):包括vector、list、deque、set、map等,用于存储和管理数据。
算法(Algorithms):包括排序、查找、复制、删除等算法,用于操作容器中的数据。
迭代器(Iterators):用于遍历容器中的元素,提供一种统一的访问方式。
仿函数(Functors):类似于函数的对象,用于封装操作,作为算法的参数。
适配器(Adapters):用于调整容器或迭代器接口,使其能够适配特定需求。
STL的基本设计思想:
泛型编程:通过模板技术实现泛型算法和数据结构,使得它们适用于多种数据类型。
封装性:STL中的各个组件都封装在独立的类或函数中,使得代码易于重用和维护。
可扩展性:STL允许用户自定义容器、迭代器和仿函数,从而满足特定的需求。
STL的实现方式:
STL的设计和实现主要基于模板元编程(Template Metaprogramming)和模板特化(Template Specialization)。
涉及到的一些技术和概念包括:迭代器设计、分配器(Allocators)、空间配置器(Memory Allocators)等。
第一章主要介绍了C++标准程序库的概念、STL的优势和组成部分,以及STL的基本设计思想和实现方式。它为后续章节深入探讨STL的各个组件奠定了基础,对于理解STL的核心思想和学习STL的源码具有重要的意义。
容器需要配置空间来存放数据。 空间配置器最本质的四个功能:
allocator 申请空间
deallocator 释放空间
construct 构造对象
destroy 摧毁对象
#pragma once
这是PJ版本的STL空间配置器,并没有完全遵守STL规则。
#include
using namespace std;
namespace CC {
template
T* _allocate(size_t n, T*) {
set_new_handler(0); //防止申请内存空间失败
T* tmp = (T*)::operator new(sizeof(T) * n); //malloc
if (tmp == 0) {
cerr << "out of memory" << endl;
exit(1);
}
return tmp;
}
template
void _deallocate(T* p) {
::operator delete(p);
}
template
void _construct(T* p,const T& value) {
new(p) T(value); //将value作为初始值开辟一块空间指向p
}
template
void _destroy(T* p) {
p->~T();
}
template
class Alloctor
{
public:
pointer allocate(size_type n, const void* hint = 0) { //申请空间
return (pointer)_allocate(n, 0);
}
void deallocate(pointer p, size_type n) { //释放空间
_deallocate(p);
}
void construct(pointer p, const T& value) { //构造对象
_construct(p,value);
}
void destroy(pointer p) { //摧毁对象
_destroy(p);
}
public:
typedef T value;
typedef T* pointer;
typedef const T& const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef const size_t size_type;
};
}