什么是STL? STL,即:Standard Template Library,是C++的一部分。 STL是常用数据结构和算法的集合。 STL的目标是标准化组件,提高开发效率和程序可靠性。
如下图所示:
STL库作为C++的一部分与编译器一同被发布 STL主要由以下3个部分组成 容器(Container):管理数据的集合 算法(Algorithm):处理集合内的元素 迭代器(Iterator):遍历集合内的元素
容器中存放的都必须是值而不能是引用。 容器内部实施的是值拷贝操作。 容器中可以存放指针作为数据元素。
STL中的容器其实就是数据结构课程中学习的链表,栈,队列和哈希表等结构。
线性表的典型操作: ―size:获取当前容器中的元素数目 ―insert:在当前元素前插入新元素 ―erase:删除当前元素 ―empty:判断当前容器是否为空 ―front:获取第一个元素 ―back:获取最后一个元素
线性表,vector的使用,代码举例:
#include <cstdlib>#include <iostream>#include <vector> //数组//这里的代码就是数组类 using namespace std;int main(int argc, char *argv[]){ vector<int> vi(10);//申请数组,设定大小为10 cout<<"vi size: "<<vi.size()<<endl; for(int i=0; i<5; i++) { vi[i] = i + 1; } vi.resize(5);//动态伸缩数组大小 cout<<"Elements in vi:"<<endl; for(int i=0; i<vi.size(); i++) { cout<<vi[i]<<endl;//输出每个元素 } vector<int> vin; vin = vi; //数组之间可以直接赋值 vi.resize(0); cout<<"Elements in vin:"<<endl; for(int i=0; i<vin.size(); i++) { cout<<vin[i]<<endl;//输出每个元素 } cout << "PRess the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}栈和队列的典型操作: ―push:无返回值,将元素压栈(队列) ―pop:弹出栈(队列)第一个元素 ―top:返回栈第一个元素 ―front:返回队列第一个元素
栈和队列,stack和queue的使用,代码举例:
#include <cstdlib>#include <iostream>#include <stack> //栈 #include <queue> //队列 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<<"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() ) //不为空,出队 { int v = q.front(); //队列首个元素 q.pop(); cout<<v<<endl; } }int main(int argc, char *argv[]){ StackUsage(); QueueUsage();//出栈和出队列的顺序是相反的 cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}STL中的迭代器是遍历容器的“标准”方式。 迭代器可以理解成一个指向元素的“指针”。
链表list和iterator迭代器的使用,代码举例:
#include <cstdlib>#include <iostream>#include <list>//链表 //本代码关于STL的迭代器的应用 using namespace std;int main(int argc, char *argv[]){ list<double> l; //定义链表 cout<<"l size: "<<l.size()<<endl;//链表大小 for(int i=0; i<5; i++) { l.push_back((i + 1) / 1000.0);//进入链表 } cout<<"l size: "<<l.size()<<endl;//链表大小 list<double>::iterator current = l.begin(); //迭代器 cout<<"Elements in l:"<<endl; while( current != l.end() )//迭代器遍历链表 { cout<<*current<<endl; current++; } current = l.begin(); current++; current++;//在第三个元素之前插入元素 l.insert(current, 0.1);//插入元素 cout<<"Elements in l:"<<endl; for(list<double>::iterator p = l.begin(); p != l.end(); p++) { cout<<*p<<endl; } cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}STL算法的使用,排序算法:
#include <cstdlib>#include <iostream>#include <vector>//数组 #include <algorithm>//本代码演示排序算法 using namespace std;void current(int& v){ cout<<v<<endl;}void print(vector<int>& vec){ cout<<"Elements in vector:"<<endl; 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=9; i>=0; i--) { v[i] = 9 - i; } print(v); sort(v.begin(), v.end(), compare);//排序算法 print(v); cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}STL是C++标配的模板库,是工程经验的总结,也是开发效率和软件可靠性的保证。
书籍推荐:
新闻热点
疑难解答