前言
自己把学习过程的一些方法和笔记,以及针对出现的各种错误解决方法共享在博客里面,都是从0基础开始的。努力再努力,每天坚持,不断地改进。
文章目录
一 STL概述
STL——Standard Template Library,中文译为“标准模板库”
二 STL特点:
STL的主要功能就是用于数据处理,是数据结构和算法的分离。这种分离确实使STL变得非常通用,程序员可以在不用思考算法就可以使用数据,在STL中体现了泛型化程序设计
三 关键字auto
auto 关键字是c语言一个弃用的关键字,c++中进行了扩展,可以自动进行类型的推导功能
auto a = 10; //a会自动推导成int
auto b = 3.14; //b推导成double
auto c = 14.2f; //c会推导成float
cout << "类型是:" << typeid(a).name() << endl;
cout << "类型是:" << typeid(b).name() << endl;
cout << "类型是:" << typeid(c).name() << endl;
foreach迭代遍历
void test()
{
int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
for (auto e : arr)
{
cout << e << " ";
}
cout << endl;
}
四 STL标准模板头文件
#include <algorithm> //算法库 sort()
#include <deque> //双端队列
#include <functional> //仿函数
#include <iterator> //迭代器
#include <vector> //动态数组(向量数组)
#include <list> //双向链表
#include <map> //映射
#include <memory> //内存管理
#include <set> //集合
#include <queue>//队列
#include <stack> //栈
五 STL中的组件
1,容器(Container)
是一种数据结构,如list,vector,和deque ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
2,迭代器(Iterator)
提供了访问容器中对象的方法。例如,可以使用一对迭代器指定容器中的一定范围的对象。迭代器就如同一个指针。迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
3,算法(Algorithm)
是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个数组容器中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
4,仿函数 Function object,函数对象(function object)
void fun(){printf("hello");}
void add(int a,int b){return a+b;}
void test()
{
void(*pFun)(); //定义一个函数指针
pFun = fun; //通过函数指针指向这个函数
pFun(); //通过指针间接调用函数
int(*pFun2)(int, int) = add;
cout << pFun2(1, 2) << endl;
///通过函数模板的形式确定引用的类型
function<void()> f = fun;
f();
function<int(int, int)> f2 = add;
cout << f2(20, 10) << endl;
}
5,迭代适配器(Adaptor),
6,空间配制器(allocator)也是我们的常用的内存对象
(1)对象的创建与销毁
(2)内存的获取与释放
5.1STL中 的容器
array<T> 是一种大小可变的数组
vector<T>是一种大小可变的向量
list<T> 是一个双向链表容器
queue<T> 是一种队列容器
stack<T> 是一种栈容器
deque<T> 是一种双端队列容器
priority_queue<T> 是一种按值排序的队列容器
set<T> 是一种集合容器
multiset<T> 是一种充许出现重复元素的集合容器
map<key,val> 是一种关联数组容器
multimap<key,val> 是一种充许出现重复key值的关联容器
5.2序列式容器
序列式容器(Sequence containers)
每个元素都有固定位置,array,vector、deque、list;
1,array 数组
(1)c语言数组
int arr[10] = {};
int arr2[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
(2)c++数组
array<int, 10> Arr = { 65, 32, 12, 5, 4, 7, 10, 1, 11, 51 };
C语言没有边界检查,Arr[15]; c++的array容器提供了越界的检查机制
2,vector: 动态数组
,
3,deque: 双端队列 (double-ended queue)的缩写,连续存储的指向不同元素的指针所组成的数组
4,list:双向链表 (double-linkedlist) 由节点组成的双向链表,每个结点包含着一个元素
5.3关联式容器
关联式容器(Associated containers)
元素位置取决于特定的排序准则,和插入顺序无关,
1,set 会自动进行排序, 不会出现重复的元素
2,multiset 多重集合(multiset) 允许存在两个次序相等的元素的集合 ,
3,map 映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列
4,multimap 多重映射(multimap) 允许键对有相等的次序的映射
底层是由内部由红黑树(RB-tree)实现,可以高效的进行查找
5.4适配器容器
优先队列(priority_queue) 底层实现用的是一个堆
智能指针
auto_ptr 将一个用new开辟内存的指针赋给auto_ptr,会自动回收空间
unique_ptr 拥有独有对象所有权语义的智能指针,一个指针指向一段内存
shared_ptr 拥有共享对象所有权语义的智能指针 。
六 总结
了解了STL是什么,以及它的特性之后,使用STL可以更加方便灵活的处理数据。下期总结STL中容器的使用。
所谓的的错误和bug
编译过程中出错叫:错误,可以直接找错误信息
运行过程中出错叫:异常,可以通过调试找到问题
程序正常运行,结果不对:bug,逻辑错误很难处理
哈哈!!