文章目录
前言
STL(Standard Template Library)是C++标准库中的一个重要组成部分,它提供了一组通用的模板类和函数,用于实现常见的数据结构和算法。STL的设计目标是提供高效、可靠和易于使用的数据结构和算法,以便开发人员可以更轻松地编写高质量的C++代码。
STL包含了许多常用的容器类(如vector、list、set、map等),这些容器类提供了不同的数据结构,以满足不同的需求。STL还提供了一系列的算法(如排序、查找、遍历等),这些算法可以直接应用于容器类,以便进行各种操作和处理。
使用STL可以带来以下好处:
- 提高开发效率:STL提供了现成的数据结构和算法,可以减少开发人员编写重复代码的工作量,从而提高开发效率。
- 提高代码质量:STL经过广泛的测试和优化,具有高效性和可靠性。使用STL可以避免一些常见的错误,并提供更稳定的代码。
- 代码重用性:STL的模板类和函数可以在不同的项目中重复使用,提高代码的重用性和可维护性。
- 标准化:STL是C++标准库的一部分,它遵循C++标准,并得到广泛支持和使用。使用STL可以使代码更具可移植性和兼容性。
一、基本概念
STL 标准模板库 Standard Template Library
STL几乎所有的代码都采用了模板类或者模板函数
1.组成
2.容器 container
STL提供的容器是常用数据结构的类模板,即实现常用数据结构
常用数据结构:数组、链表、树、栈、队列、集合、映射表等
序列容器 | 提供顺序表的表示和操作。强调值的排序,序列式容器中的每个元素均有固定的位置 |
---|---|
vector | 向量。可以随机访问序列中的单个元素,在序列尾快速插入和删除元素。如果在序列中插入和删除元素,则所需时间与序列长度成正比。 |
deque | 双向队列。随机访问序列中的单个元素,可以在序列头或尾快速插入和删除元素。如果在序列中插入和删除元素,则所需时间与序列长度成正比。 |
list | 双向链表。用动态链式结构存放数据,可以从任何位置快速插入和删除元素。 |
关联容器 | 提供集合和映像的表示和操作。二叉树结构,各元素之间没有严格的物理上的顺序关系 |
---|---|
set | 集合。无重复值元素,可以实现快速查找。 |
multiset | 集合。允许重复值元素,可以实现快速查找。 |
map | 映射。一对一映射,无重复值元素,实现基于关键字的快速查找。 |
multimap | 映射。一对多映射,允许重复值元素,实现基于关键字的快速查找。 |
容器适配器 | 特殊顺序表 |
---|---|
stack | 堆栈。后进先出(LIFO)表,只能在表头插入和删除元素。 |
queue | 队列。先进先出(FIFO)表,只能在表头删除元素,在表尾插入元素。 |
priority_queue | 优先队列。优先级最高的元素总是第一个出列。 |
3.迭代器 iterator
容器与算法之间的粘合剂。
迭代器是STL提供的对顺序容器和关联容器操作的模板,是功能更强、更安全的容器指针。
每一个容器都有自己的迭代器。
vector<int>::iterator p;//p被称为迭代子或迭代算子
//迭代子是指向容器类型的指针变量,用于操作容器中的元素
迭代器类型 | 操作(p、q为迭代子,i为整数) |
---|---|
所有迭代器 | ++p,p++ |
输入(input) | *p(右值),p->(右值),p=q,p==q,p!=q |
输出(output) | *p(左值),p=q |
正向(forward) | 输入和输出迭代器的全部操作 |
双向(bidirectional) | - -p,p- -及正向迭代器的全部操作 |
随机(random access) | p+=i,p-=i,p+i,p[i],p<q,p<=q,p>q,p>=q及双向迭代器的全部操作 |
4.算法 algorithm
C++的STL中包含大约70种标准算法。
这些算法是用于对容器的数据施加特定操作的函数模板。
迭代器的迭代子协同访问容器中的元素。
在头文件algorithm中声明。
二、vector存放内置数据类型(三种遍历方式)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void MyPrint(int vdata)
{
cout<<vdata<<endl;
}
void test1()
{
//创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;//可看作数组
//向容器中存放数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
//每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
//vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
//第一种遍历方式
vector<int>::iterator pBegin=v.begin();
//v.begin()返回迭代器,这个迭代器指向容器中第一个数据
vector<int>::iterator pEnd=v.end();
//v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
while(pBegin!=pEnd)
{
cout<<*pBegin<<endl;
pBegin++;
}
//第二种遍历方式
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
cout<<*it<<endl;
//第三种遍历方式 使用遍历算法for_each
for_each(v.begin(),v.end(),MyPrint);
}
int main()
{
test1();
return 0;
}
三、vector存放自定义类型
#include<iostream>
using namespace std;
#include<vector>
#include<string>
class Person
{
public:
Person(string name,int age)
{
Name=name;
Age=age;
}
public://不能是private
string Name;
int Age;
};
//存放对象
void test01()
{
vector<Person> v;
Person p1("aaa",1);
Person p2("bbb",2);
Person p3("ccc",3);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
cout<<(*it).Name<<" "<<it->Age<<endl;//it 指向对象的指针
}
//放对象指针
void test02()
{
vector<Person*> v;
Person p1("aaa",1);
Person p2("bbb",2);
Person p3("ccc",3);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
for(vector<Person*>::iterator it=v.begin();it!=v.end();it++)
{
Person *p=(*it);//it 指向对象的地址的指针
cout<<(*p).Name<<" "<<p->Age<<endl;
}
}
int main()
{
test01();
test02();
return 0;
}
四、容器嵌套容器
二维数组
#include<iostream>
#include<vector>
using namespace std;
void test01()
{
vector< vector<int> > v;
vector<int> v1;
vector<int> v2;
vector<int> v3;
for(int i=0;i<3;i++)
{
v1.push_back(i+1);
v2.push_back(i+2);
v3.push_back(i+3);
}
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
for(vector< vector<int> >::iterator it=v.begin();it!=v.end();it++)
{
for(vector<int>::iterator vit=(*it).begin();vit!=(*it).end();vit++)
{
cout<<*vit<<" ";
}
cout<<endl;
}
}
int main()
{
test01();
return 0;
}