概述
简介
简单介绍:C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈等。
STL的一个重要特点就是数据结构和算法的分离。例如,STL中sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。
STL另一个重要特性是它不是面向对象的,主要依赖于模版,而不是封装和继承
常用基本组件
容器:容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
迭代器:迭代器提供了访问容器中对象的方法。例如,可以使用迭代器指定list或vector中的一定范围的对象。
算法:算法是用来操作容器中的数据的模板函数。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
由此可见,算法和迭代器组件都是作用于容器的。
适配器:
还有其它两个个不常用的组件,分别是:仿函数(function object)、空间配制器(allocator)。
容器
之前在使用数组解决问题时,我们必须要知道或者估算出大约要存储多少个对象,这样我们会创建能够容纳这些对象的内存空间大小。当我们要处理一些完全不知道要存储多少对象的问题时,数组显的力不从心。
那么我们便我们可以使用容器来解决这个问题。容器具有很高的可扩展性,我们不需要预先告诉它要存储多少对象,只要创建一个容器,并合理的调用它所提供的方法,所有的处理细节由容器自身完成。
顺序容器
顺序容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序,比如我们一次性对一个顺序容器追加三个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是一致的。
vector
可变大小数组,支持快速随机访问,在尾部之外的位置插入或者删除元素可能很慢。
适用于大量读写,而插入、删除比较少的操作。
用法总结
- 头文件
#include <vector>
- 声明及初始化
vector<int> vec; //声明一个int型向量
vector<int> vec(5); //声明一个初始大小为5的int向量
vector<int> vec(10, 1); //声明一个初始大小为10且值都是1的向量
vector<int> vec(tmp); //声明并用tmp向量初始化vec向量
- 容量
vec.size(); //大小
vec.capacity(); //真实大小
vec.max_size(); //最大容量
vec.resize(); //更改大小
vec.empty(); //判空
- 修改
vec.push_back(); //末尾添加元素
vec.insert(); //任意位置插入元素
vec.pop_back(); //末尾删除元素
vec.erase(); //任意位置删除元素
vec.swap(); //交换两个元素
vec.clear(); //清空元素
5.元素的访问
vec[1]; //下标访问,并不会检查是否越界
vec.at(1); //at方法访问,以上两者的区别就是at会检查是否越界
vec.front(); //访问第一个元素
vec.back(); //访问最后一个元素
int* p = vec.data(); //返回一个指针,可行的原因在于vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组。这是是C++11的特性。
6.算法
- 遍历
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << endl;
//或者
for (size_t i = 0; i < vec.size(); i++) {
cout << vec.at(i) << endl;
}
- 排序
sort(vec.begin(), vec.end()); //采用的是从小到大的排序
//如果想从大到小排序,可以采用下面的反转函数,也可以采用下面方法:
bool Comp(const int& a, const int& b) {
return a > b;
}
sort(vec.begin(), vec.end(), Comp);
- 翻转
#include <algorithm>
reverse(vec.begin(), vec.end());