C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
C++ 标准模板库的核心包括以下三个组件:
组件 | 描述 |
---|---|
容器(Containers) | 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。 |
算法(Algorithms) | 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。 |
迭代器(iterators) | 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。 |
这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。
其中还包含了仿函数(Functor)、适配器(Adaptor)、分配器(allocator)等。
STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。
容器类自动申请和释放内存,无需new和delete操作。
序列式容器(Sequence containers)包含Vector、Deque、List等。
Vector:将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时;
Deque:是“double-ended queue”的缩写,可以随机存取元素(用索引直接存取),数组头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时;
List:双向链表,不提供随机存取(按顺序走到需存取的元素,O(n)),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针;
Vector
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。
它的特性如下所示:
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。
容器使用一个内存分配器对象来动态地处理它的存储需求。
Vector的基本函数实现:
1、构造函数
- vector():创建一个空vector
- vector(int nSize):创建一个vector,元素个数为nSize
- vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
- vector(const vector&):复制构造函数
- vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
2、增加函数
- void push_back(const T& x):向量尾部增加一个元素X
- iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
- iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
- iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
3、删除函数
- iterator erase(iterator it):删除向量中迭代器指向元素
- iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
- void pop_back():删除向量中最后一个元素
- void clear():清空向量中所有元素
4、遍历函数
- reference at(int pos):返回pos位置元素的引用
- reference front():返回首元素的引用
- reference back():返回尾元素的引用
- iterator begin():返回向量头指针,指向第一个元素
- iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
- reverse_iterator rbegin():反向迭代器,指向最后一个元素
- reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
5、判断函数
- bool empty() const:判断向量是否为空,若为空,则向量中无元素
6、大小函数
- int size() const:返回向量中元素的个数
- int capacity() const:返回当前向量所能容纳的最大元素值
- int max_size() const:返回最大可允许的vector元素数量值
7、其他函数
- void swap(vector&):交换两个同类型向量的数据
- void assign(int n,const T& x):设置向量中前n个元素的值为x
- void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
创建一个实例对数组进行插入、移除、清空和排序等操作。
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec;
for (int i = 0; i < 10; ++i) {
int random = rand() % 100;
vec.push_back(random);
cout << vec[i] << ", ";
}
vec.pop_back(); // 移除数组最后一个数据
cout << endl;
// Vector数据进行排序
cout << "从小到大排序输出:" << endl;
sort(vec.begin(), vec.end());
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << ", ";
}
cout << endl;
cout << "从大到小排序输出:" << endl;
reverse(vec.begin(), vec.end());
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << ", ";
}
}
运行上面的程序,输出结果如下:
41, 67, 34, 0, 69, 24, 78, 58, 62, 64,
从小到大排序输出:
0, 24, 34, 41, 58, 62, 67, 69, 78,
从大到小排序输出:
78, 69, 67, 62, 58, 41, 34, 24, 0,
其中vector除了直接通过下标访问数组外,还可以通过迭代器的方式访问:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec;
for (int i = 0; i < 10; ++i) {
int random = rand() % 100;
vec.push_back(random);
}
cout << endl;
// 利用迭代器取出数组元素
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++) {
cout << *it << ", ";
}
}
如果是二维数组,有两种定义方式:
1) 定义方式一
#include <iostream>
#include <vector>
using namespace std;
int main(){
int N = 5, M = 6;
vector<vector<int> > vec(N); //定义二维动态数组大小5行
for (int i = 0; i < vec.size(); i++) {
vec[i].resize(M);
}
for (int i = 0; i < vec.size(); i++) { //输出二维动态数组
for (int j = 0; j < vec[i].size(); j++) {
cout << vec[i][j] << ",";
}
cout << endl;
}
}
2)定义方式二
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N = 5, M = 6;
vector<vector<int> > vec(N, vector<int>(M));
for (int i = 0; i < vec.size(); i++) {
for (int j = 0; j < vec[i].size(); j++) {
cout << vec[i][j] << " ";
}
cout << endl;
}
}
关联式容器(Associated containers)包含Set/Multiset、Map/Multimap等。
Set/Multiset:内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现,便于查找;
Map/Multimap:Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现,便于查找;
原文:https://www.cnblogs.com/pengjingya/p/14406941.html