C++_STL使用手册

STL基础

STL全称为 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合;
STL由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成,其中后面 4 部分是为前 2 部分服务的,

  • 容器: 管理某一些对象的集合;可分为序列式容器、关联式容器、无序关联式容器、容器适配器;
  • 算法: 为容器提供了执行各种操作的方式;

大部分算法都包含在头文件 <algorithm> 中,少部分位于头文件 <numeric> 中。

  • 迭代器: 对容器中的读和写都是通过迭代器完成的,迭代器可用于遍历对象集合的元素;

容器的分类

1. 序列式容器:
以线性顺序排列的方式存储某一指定类型的数据;元素在容器中的位置同元素的值无关,即容器不是排序的,元素的排列与元素的值无关;
主要包括:

  • vector 向量容器;
  • list 列表容器;
  • deque 双端队列容器;

2. 关联式容器:
关联式容器使用键值对(pair 类型)的方式存储数据;若已知目标元素的键,就可以直接找到目标元素的值;
根据容器内部存储的元素是否有序,又可进一步划分为:排序容器和哈希容器;

a. 排序容器:
排序容器中的元素默认是由小到大排序好的,即便是插入元素,元素也会插入到适当位置,所以其在查找时具有非常好的性能;
底层采用红黑树存储结构,适用于有序处理元素,查找元素 O ( l o g n ) O(logn) O(logn)
主要包括:

  • set 集合容器;
  • multiset多重集合容器;
  • map映射容器;
  • multimap 多重映射容器;
    序列式容器中存储的元素默认都是未经过排序的,而使用关联式容器存储的元素,默认会根据各元素的键值的大小做升序排序。

b. 哈希容器(无序容器、无序关联容器):
和排序容器不同,哈希容器中的元素是未排序的,元素的位置由哈希函数确定;
底层采用哈希表存储结构,适用快速查找元素 O ( 1 ) O(1) O(1)
主要包括:

  • unordered_set 哈希集合;
  • unordered_multiset 哈希多重集合;
  • unordered_map 哈希映射;
  • unordered_multimap 哈希多重映射;

1. 序列式容器:

1.1. vector

  • 倍增思想:

操作系统中为程序分配空间时,所需时间与空间大小无关,与申请次数有关;因此vector变长数组应该尽量减少空间申请的次数,所以vector分配空间时采用倍增思想:当变长数组长度不够时,就再申请一块原来两倍大小的空间,然后再将原本的数复制过去;

  • 支持随机寻址,可以直接使用数组下标访问元素;
  • 支持比较运算,按字典序

#include<vector>

  1. 初始化
vector<int> v1; 		//定义一个int类型的元素
vector<int> v2(10);		//定义一个长度为10的数组,默认值为0
vector<int> v3(10,1);	//定义一个长度为10的数组,指定值为1
vector<int> v4[10];		//定义一个长度为10的vector,相当于二维数组
  1. 成员函数
vector<int> a;

a.empty();	//判断a是否为空
a.size();	//返回a的元素个数
a.clear();	//清空a的所有元素

a.push_back();	//在a的尾部添加一个元素
a.pop_back();	//移除a的尾部元素
a.front();		//返回a的第一个元素的值
a.back();		//返回a的最后一个元素的值

a.begin();		//返回第一个元素的迭代器(地址)
a.end();		//返回最后一个元素的后一个位置的迭代器
a.rbegin();		//返回最后一个元素的迭代器
a.rend();		//返回第一个元素的前一个位置的迭代器

  1. 数据的遍历
  • 使用迭代器进行遍历
//迭代器定义
//容器类名::iterator 迭代器名
vector<int>::iterator i;

for (vector<int>::iterator i = a.begin(); i != a.end(); i++)
    cout << *i << endl;		//访问的是地址指针 所以要加*

//为了进一步简化书写,使用auto,auto可以根据变量的值自动推导变量的类型
for (auto i = a.begin(); i != a.end(); i++)
    cout << *i << endl;	
  • 增强for循环(范围for循环)

在增强for循环中,不需要事先指明数组遍历起点和遍历长度,增强for循环会自动根据数组长度将数组中的每一个数据赋值给同类型的val,逐个遍历数组中每一个元素;

type iterable[n];
for(type val:iterable) 	//type val = arr[i]
{
   
	// do something with val
}
vector<int> a;

for (auto i : a) 
    cout << i << " ";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值