STL六大组件目录
- 前言
- 1、配置器
- (1)What
- (2)Why
- (3)How
- A.调用new和delete实现内存分配与销毁
- B.STL Allocator
- (4)allocator类
- A.What
- B.How
- C.allocator的算法
- 2、容器
- (1)What
- (2)Which(有哪些容器)
- (3)序列容器(顺序容器)
- A.Which
- B.array:存储固定长度元素的序列
- C.deque队列
- D.forward_list
- 3、迭代器
- 4、算法
- 5、仿函数
- 6、适配器
前言
仿函数提供了一种调用算法的方式、算法通过迭代器对容器里边的数据进行访问和处理、迭代器是访问容器中数据的重要方式、而容器所占有的内存空间是由配置器分配和管理的。此外,适配器是对容器、迭代器或仿函数的一个封装。
1、配置器
(1)What
负责空间配置与管理,从实现角度来看,配置器是一个实现了动态空间配置、空间管 理、空间释放的类模板
(2)Why
动态内存管理(内存分配、对象构造、对象析构、内存释放、内存重新分配等)
(3)How
A.调用new和delete实现内存分配与销毁
B.STL Allocator
对象的构造由allocator类的construct负责,对象的释放由destroy负责
内存配置由allocate()负责,内存释放由deallocate()负责
(4)allocator类
A.What
C++11中预定义的配置器类,用于管理容器的内存分配是释放
B.How
allocator类的使用主要关注它的四个成员函数:
- 分配内存:allocate()
- 构造对象:construct(),在分配好的内存中构造对象
- 销毁对象:destroy(),回收已分配的内存空间,释放数据对象
- 回收内存:deallocate(),将内存空间归还给操作系统
//分配 10 个 string 类型的对象的内存(未初始化)
std::allocator<string> alloca;
auto const p=alloca.allocate(10); //分配未构造的内存
alloca.construct(p,"zhangsan");
auto q=p;
alloca.construct(++q,"lisi");
alloca.construct(++q,"wangwu");
cout<<(*q)<<endl; //打印:wangwu
//使用完对象后,必须对每个构造的元素调用 destroy 类销毁它们
while(q!=p)
{
alloca.destroy(--q);
}
//元素被销毁之后,可以重新使用 alloca,也可以归还给系统
alloca.deallocate(p,10);
C.allocator的算法
//拷贝和填充未初始化内存的算法:在未初始化的内存中创建对象
std::vector<int> vec_a{1,2,3,4,5};
std::allocator<int> alloca_int;
int* p_int=alloca_int.allocate(vec_a.size()*2);//p_int 为 int 类型的指针
//拷贝元素到 alloca_int 的内存中去
std::uninitialized_copy(vec_a.begin(),vec_a.end(),p_int);
for(int i=0;i<vec_a.size();++i){cout<<*(p_int+i)<<" ";}cout<<endl;//打印:1 2 3 4 5
//将剩余的元素初始化为 100
std::uninitialized_fill_n(p_int,vec_a.size(),100);
for(int i=0;i<vec_a.size();++i){cout<<*(p_int+i)<<" ";}cout<<endl;//打印:100 100 100 100 100
2、容器
(1)What
本质是标准库中特定用于存储和管理数据的类模板
(2)Which(有哪些容器)
- 序列容器(顺序容器):容器中的数据是有序的
- 关联容器:通过键值对(key-valuepair)来组织和访问元素,将红黑树作为底层数据结构,用于维护 键值对集合,并提供高效的元素访问和操作能力,本质是类模板
(3)序列容器(顺序容器)
A.Which
array、deque、forwarrd_list、list、vector
B.array:存储固定长度元素的序列
非成员函数
- get(array):
template <int Index, class T, size_t N> constexpr T& get(array<T,N>&arr> noexcept;
std::array<int,4> c0{0,1,2,3}; //创建并初始化一个array类对象c0
for(const int &iTmp:c0)
{
cout<<" "<<iTmp;
}
int i1 = std::get<1>(c0); // 得到1
int i3 = std::get<3>(c0); // 得到3
- swap(array01, array02):
template<class T, std::size_t N>
void swap(array<T, N>&arr01, array<T,N> &arr01);
//成员函数
arr01.swap(arr02);
//非成员函数
swap(arr01, arr02);
- 其它非成员函数:
成员函数
成员函数 | 说明 |
---|---|
array() | 构造函数 |
at() | 返回指定位置的引用 |
font() / back() | 返回第一个元素 (最后一个)元素的引用 |
begin() / end() | 返回第一个(最后一个)元素的迭代器 |
cbegin() / cend() | 返回第一个(最后一个)元素的常量迭代器 |
rbegin() / rend() | 返回反向数据中第一个(最后一个)元素的迭代器 |
data() | 返回第一个元素的地址 |
empty() | 测试array对象中是否存在数据 |
fill() | 将所有元素替换为指定值 |
assign() | 同fill |
size() | 返回array对象中元素的个数 |
swap() | 交换两个array对象的数据 |
C.deque队列
非成员函数:
- swap(q01,q02):交换两个队列数据
成员函数:
成员函数 | 说明 |
---|---|
at() | 返回指定位置的引用 |
font() / back() | 返回第一个元素 (最后一个)元素的引用 |
begin() / end() | 返回第一个(最后一个)元素的迭代器 |
cbegin() / cend() | 返回第一个(最后一个)元素的常量迭代器 |
rbegin() / rend() | 返回反向数据中第一个(最后一个)元素的迭代器 |
data() | 返回第一个元素的地址 |
empty() | 测试容器中是否存在数据 |
fill() | 将所有元素替换为指定值 |
assign() | 同fill |
size() | 返回array对象中元素的个数 |
swap() | 交换两个容器的数据 |
emplace() | 就地构造元素插入到deque指定位置 |
emplace_back() / emplace_front() | 就地构造元素插入到末尾(开头) |
erase() | 从指定位置删除一个或多个元素 |
insert() | 在指定位置插入一个或多个元素 |
pop_back() / pop_front() | 清除deque末尾(开头)元素 |
push_back() / push_front() | 添加元素到末尾(开头) |
resize() | 为deque指定新的大小 |