STL
栈
stack 模板类的定义在<stack>头文件中。
stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。
定义stack 对象的示例代码如下:
stack<int> s1;
stack<string> s2;
stack 的基本操作有:
入栈,如例:s.push(x);
出栈,如例:s.pop(); 注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s.top()
判断栈空,如例:s.empty(),当栈空时,返回true。
访问栈中的元素个数,如例:s.size()。
队列
queue 模板类的定义在<queue>头文件中。
与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。
定义queue 对象的示例代码如下:
queue<int> q1;
queue<double> q2;
queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()。
优先队列
在<queue>头文件中,还定义了另一个非常有用的模板类priority_queue(优先队列)。优先队列与队列的差别在于优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权顺序出队(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)。
priority_queue 模板类有三个模板参数,第一个是元素类型,第二个容器类型,第三个是比较算子。其中后两个都可以省略,默认容器为vector,默认算子为less,即小的往前排,大的往后排(出队时序列尾的元素出队)。
定义priority_queue 对象的示例代码如下:
priority_queue<int> q1; // 实现大根堆 priority_queue< pair<int, int> > q2; // 注意在两个尖括号之间一定要留空格。 priority_queue<int, vector<int>, greater<int> > q3; // 定义小的先出队,实现小根堆 // greater要用到#include <functional>头文件
priority_queue 的基本操作:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问堆顶元素,q.top()。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()。
初学者在使用priority_queue 时,最困难的可能就是如何定义比较算子了。如果是基本数据类型,或已定义了比较运算符的类,可以直接用STL 的less 算子和greater算子——默认为使用less 算子,即小的往前排,大的先出队。如果要定义自己的比较算子,方法有多种,这里介绍其中的一种:重载比较运算符。优先队列试图将两个元素x 和y 代入比较运算符(对less 算子,调用x<y,对greater 算子,调用x>y),若结果为真,则x 排在y 前面,y 将先于x 出队,反之,则将y 排在x 前面,x 将先出队。
bool operator < (const T &t1, const T &t2) // less算子用到 { return t1.z < t2.z; // 按照z 的顺序来决定t1 和t2 的顺序 } // priority_queue<T> pq; bool operator > (const T &t1, const T &t2) // greater算子用到 { return t1.z > t2.z; // 按照z 的顺序来决定t1 和t2 的顺序 } // priority_queue<T, vector<T>, greater<T>> pq;
定义比较算子参考:priority_queue,以及运算符重载 、STL-priority_queue用法(重点: 升序,小根堆)
#include <iostream> #include <functional> // greater #include <string> #include <queue> using namespace std; struct Student { string name; int age; friend bool operator > (const Student &s1, const Student &s2) { return s1.age > s2.age; } }; int main() { Student s1; s1.name = "xiaoming"; s1.age = 12; Student s2; s2.name = "xiaohong"; s2.age = 15; priority_queue<Student, vector<Student>, greater<Student>> pq; pq.push(s1); pq.push(s2); Student s = pq.top(); cout << s.age << endl; // 12 getchar(); return 0; }
vector
vector是C++标准模版库(STL,Standard Template Library)中的部分内容。之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
使用vector容器之前必须加上<vector>头文件:#include<vector>;
vector属于std命名域的内容,因此需要通过命名限定:using std::vector;也可以直接使用全局的命名空间方式:using namespace std;
c.push_back(elem)在尾部插入一个elem数据。
c.pop_back()删除末尾的数据。
c.front()返回第一个数据。
c.back()传回最后一个数据,不检查这个数据是否存在。
c.begin()返回指向第一个数据的迭代器。
c.end()返回指向最后一个数据之后的迭代器。
vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); vector<int>::iterator it; for(it = v.begin();it!=v.end();it++){ cout << *it << "\t"; } cout << endl;
c.clear()移除容器中的所有数据。
c.empty()判断容器是否为空。
c.size()返回容器中实际数据的个数。
vector的类定义
template <class t="" class="" alloc="alloc"> class vector { public: typedef T value_type; typedef value_type* iterator; // ... iterator begin() { // ... } }
algorithm
在#include <algorithm>这个头文件中有swap函数,其函数原型如下:
template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; }
标准库函数qsort
#include <iostream> using namespace std; int compare(const void * a, const void * b) { return *(int*)a - *(int*)b; } int main() { int numbers[] = { 40, 10, 100, 90, 20, 25 }; qsort(numbers, 6, sizeof(int), compare); for (int i = 0; i < 6; i++) cout << numbers[i] << endl; getchar(); return 0; }
详细参考:C语言标准库函数qsort那点小事