第23课 - STL简介
一.什么是STL(标准模板库)?
1.1 STL,即Standard Template Library,是C++的一部分
1.2 STL是常用数据结构和算法的集合
1.3 STL的目标是标准化组件,提高开发效率和程序可靠性
二.STL库作为C++的一部分与编译器一同被发布
2.1 STL主要由以下三个部分组成
-容器:管理数据的集合(链表,队列,栈)
-算法:处理集合内的元素
-迭代器:遍历集合内的元素
2.2 STL中的容器(链表,栈,队列,哈希表)
2.2.1 容器中存放的都必须是值,而不能是引用
2.2.2 容器内部实施的是值拷贝操作
2.2.3 容器中可以存放指针作为数据元素
a.线性表的典型操作:
-size: 获取当前容器中的元素数目
-insert: 在当前元素面前插入新元素
-erase: 删除当前元素
-empty: 判断当前容器是否为空
-front: 获取第一个元素
-back: 获取最后一个元素
Source Example 2.2.1(vector,数组类的使用):
#include <iostream>
#include <vector>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
/* 本质就是一个数组类 */
vector<int> vi(10);
for (int i = 0; i < 5; i++)
{
vi[i] = i + 1;
}
/* 动态将数组类大小进行伸缩,新元素的初始值为0 */
vi.resize(5);
for (int i = 0; i < vi.size(); i++)
{
cout<<vi[i]<<endl;
}
vector<int> vin;
/* 两个数组可以相互赋值 */
vin = vi;
vi.resize(0);
for (int i = 0; i < vin.size(); i++)
{
cout<<vin[i]<<endl;
}
return 0;
}
b.栈性质:后进先出(LIFO->Last In First Out)
c.队列性质:先进先出(FIFO)
栈和队列的典型操作:
push: 无返回值,将元素压栈(队列)
pop: 弹出栈(队列)第一个元素
top: 返回栈第一个元素
front: 返回队列第一个元素
Source Example 2.2(stack和queue的使用):
#include <iostream>
#include <stack>
#include <queue>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
void StackUsage()
{
cout<<"Stack Usage:"<<endl;
stack<double> s;
for (int i = 0; i < 5; i++)
{
s.push(i / 100.0);
}
cout<<"Elements in s:"<<endl;
while (!s.empty())
{
double v = s.top();
s.pop();
cout<<v<<endl;
}
}
void QueueUsage()
{
cout<<endl<<"Queue Usage:"<<endl;
queue<int> q;
for (int i = 0; i < 5; i++)
{
q.push(i + 1);
}
cout<<"Elements in q:"<<endl;
while (!q.empty())
{
double v = q.front();
q.pop();
cout<<v<<endl;
}
}
int main(int argc, char** argv) {
StackUsage();
QueueUsage();
return 0;
}
输出结果如下:
2.3 STL中的迭代器
2.3.1 STL中的迭代器是遍历容器的"标准"方式
迭代器可以理解为一个指向元素的"指针"
Source Example2.3(list和iterator的使用):
#include <iostream>
#include <list>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
void ListUsage()
{
cout<<"ListUsage:"<<endl;
/* 双向链表 */
list<double> l;
for (int i = 0; i < 5; i++)
{
l.push_back((i + 1) / 1000.0 );
}
cout<<"Element in l:"<<endl;
/* 迭代器p其实就是一个指针 */
list<double>::iterator p = l.begin();
while (p != l.end())
{
cout<<*p<<endl;
p++;
}
}
int main(int argc, char** argv) {
ListUsage();
return 0;
}
输出结果如下:
2.3 STL中提供了大多数常用的泛型算法
(遍历,排序,反转,合并等等)
算法头文件<algorithm>
Source Example2.3 (STL中算法的使用):
#include <iostream>
#include <algorithm>
#include <vector>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
void current(int& v)
{
cout<<v<<endl;
}
void print(vector<int>& vec)
{
cout<<"Elements in vector:"<<endl;
/* 遍历算法,每次遍历执行current函数,将数值作为参数传递 */
for_each(vec.begin(), vec.end(), current);
}
int compare(const int &a, const int &b)
{
return a > b;
}
int main(int argc, char** argv) {
vector<int> v(10);
for (int i = 0; i < 10; i++ )
{
v[i] = i;
}
print(v);
/* 排序算法,从v.begin到v.end进行由大到小排序 */
sort(v.begin(), v.end(), compare);
print(v);
return 0;
}