第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; }