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 << "	";
}
cout << endl;

c.clear()移除容器中的所有数据。

c.empty()判断容器是否为空。

c.size()返回容器中实际数据的个数。

原文:STL之vector容器详解

vector的类定义

template <class t="" class="" alloc="alloc">
class vector {  
public:  
  typedef T value_type;
  typedef value_type* iterator;  
  // ...
  iterator begin() { // ... }
}

 原文:STL vector 源码解析

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那点小事

原文地址:https://www.cnblogs.com/xwz0528/p/4749704.html