stl map 查找不到返回什么_集“美貌”与“才华”于一身的标准模板库(STL)

一、六大部件

  1. 「容器」

容器是一个holder object,用于存储其他对象(其元素)的集合。可以看成是一类数据的持有和管理者,它们作为类模板实现,这在作为元素支持的类型上提供了极大的灵活性。容器管理其元素的存储空间,并提供直接访问它们的成员函数或通过迭代器(具有与指针相似的属性的引用对象)访问。

  • 容器可以分为序列容器、关联容器、无序关联容器、容器适配器、近容器。
  1. 「算法」(函数模板)

  2. 「迭代器」(对指针的一种泛化)

迭代器底层是由指针实现的,是容器和算法的桥梁。STL 里大多数容器都实现了自己的迭代器,我们可以使用迭代器来完成对容器的访问。迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。迭代器基本分为五种,输入、输出迭代器,正向迭代器,双向迭代器和随机迭代器。

  1. 「适配器」

适配器主要有容器适配器,迭代器适配器,函数适配器

  1. 「空间配置器」

空间配置器就是 STL 自己的“内存池”。完成对内存的申请,释放,维护。配置器有两个部分:一级空间配置器,二级空间配置器。

  1. 「仿函数」(函数对象)

仿函数又叫做函数对象,其本质是类的对象,一种可回调机制,在类中重载了()运算符,使对象在用()时呈现出函数的特性,所以叫做仿函数。叫仿函数体现了它的作用,叫函数对象体现其本质。

  • 函数对象与函数指针相比有两个优点:第一是编译器可以内联执行函数对象的调用;第二是函数对象内部可以保持状态。
78d821be9d4f1ec14a78282afd0aa05f.png

「STL的核心部件为容器、迭代器、算法三部分;适配器分别对容器、迭代器、算法进行了补充和适配,分配器为容器中的元素提供空间存储管理,仿函数丰富了算法的实现方式。」

容器

容器分类

  • STL容器高可复用的实现了在编程中非常常用的数据结构:动态数组(vector),队列(queue),堆栈(stack),堆(priority_queue),链表(list),树(set),关联数组(map)

  • stack,queue和priority_queue被实现为容器适配器。容器适配器不是完整的容器类,而是提供特定接口的类,这些接口依赖于某一类容器类(例如双端队列或列表)的对象来处理元素。基础容器的封装方式使得容器适配器的成员可以独立于所使用的基础容器类来访问其元素。

33fed42f5dc13ad0ab7481b844c52b7d.png

0bfc1b2944f279c3c7071c8abb75b990.png

官方文档:容器类模板详细介绍

迭代器

容器中元素的访问依赖于迭代器(只有底层是连续数组空间存储的容器才能通过[下标]访问,vector、deque、array)。

STL根据实现功能的强弱将迭代器划分为五种类型:官方文档

3a142e2686544c7f84209179669a60cd.png

  • 每种容器所支持的迭代器决定了该容器所适用的STL算法。支持随机访问迭代器的容器可用于所有STL算法;指向数组的指针可以代替迭代器用于几乎几乎所有的STL算法。

  • 容器的元素插入、删除、修改操作可能会导致容器对应的迭代器失效。

容器类型容器支持的迭代器类型
序列容器array随机访问迭代器
deque随机访问迭代器
vector随机访问迭代器
forward_list正向迭代器
list双向迭代器
关联容器set双向迭代器
multiset双向迭代器
map双向迭代器
multimap双向迭代器
无序关联容器unordered_set正向迭代器
unordered_multiset正向迭代器
unordered_map正向迭代器
unordered_multimap正向迭代器
容器适配器stack不支持迭代器
queue不支持迭代器
priority_queue不支持迭代器

常用的预定义迭代器类

  • 「iterator」  基本迭代器类 具有读写的能力

  • 「const_iterator」  只读(不能修改迭代器所指元素)

  • reverse_iterator 反向遍历

  • 「const_reverse_iterator」

例如std::vector::begin()返回值为iterator或const_iterator;而std::vector::rbegin()返回值为reverse_iterator或const_reverse_iterator。C++11标准之前是通过函数重载来返回普通迭代器和常量迭代器的,C++11标准则是用cbegin()、cend()、crbegin()、crend()显式区分。

#include 
#include 
int main (){
  std::vector<int> myvector;
  for (int i=1; i<=5; i++) myvector.push_back(i);
  std::cout <"myvector contains:";
  for (std::vector<int>::const_iterator it = myvector.cbegin() ; it != myvector.cend(); ++it)
    std::cout <' ' <//myvector.begin()返回const_iterator类型的迭代器给it
  std::cout <'\n';
  for (std::vector<int>::reverse_iterator it = myvector.rbegin() ; it != myvector.rend(); ++it)
    std::cout <' ' <  std::cout <'\n';
  return 0;
}

算法

STL提供了可以用于多种容器的算法,包含了常用的排序、搜索、取最值等操作。详见官方文档

  • 对头文件中的算法大致分类:
7a41050f9154483dbf3c295a6c4d3b59.png

14bc90065bcfe34ba18d0b6e0ac7e2e7.gif

dce8f588e86daa6035a35662728ec1a8.png

End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值