STL中的部分简单应i用包括栈(stack)、队列(queue)、其中队列还有特殊的优先队列(priority_queue);还有vector-动态数组、其次还有sort排序以及生成排序等多种排序方法,其中包括upper_bound和lower_bound的寻址排序法方便返回特定元素的第一个位置。其次还有set和multiset 与map和multimap等简单应用问题。ios
首先介绍一下栈、队列、以及优先队列、动态数组的共同点与不一样点:web
咱们先来认识一下栈(stack):
栈是一种先进后出的数据结构,相似于只有出入口相同的一个线性排列,可是一端封闭,只有入口处(即最顶端)能够进行移除等操做。
队列queue相似于栈,可是它是一种先进先出的数据结构,即一个入口,一个出口,互不相通,入口只能输入数据,不负责输出,出口处与之相似,只负责输出,即从底端加入元素,但从顶端输出。
优先队列与队列更加接近,基本输入输出结构与队列相似,但输出元素顺序有所限定,能够默认为优先队列(priority_queue)拥有权值观念,挑三拣四,它会自动依照元素的权值进行排列,权值最高的排在最前面,即权值高者优先输出,也就是老是弹出键值最大元素,所以称之为优先队列。这里的权值排序输出其实是利用了pop_heap(max_haep)算法,所以能够将优先队列内部看做一个heap。
动态数组(vector),听名字就好似数组,但出如今这里,也有部分相似于线性数据结构的性质,便可以经过指定下标对相应元素进行单独处理,也能够相似于线性排列对数据元素进行统计,增添,插入,删除等操做。
初步说明他们之间的一些共性,即头文件,定义方式,操做等方面都十分类似:
头文件:
#include<stack/queue/vector>
都要在程序开始前对头文件进行相应处理。
定义:
stack<data_type> stack_name;
queue <data_type> queue_name;
priority_queue <data_type> priority_queue_name;
vector <data_type> vector_name;
定义出来相似于
stacks;等
更加相似的是操做:
例如在栈中,一系列操做以下:
empty();表示返回bool值,表示栈内是否为空;
size();表示返回栈内元素的个数;
top();表示返回栈顶元素值;
pop();表示移除栈顶元素;
push(date_type a);表示想站定压入一个元素;
固然程序执行时的状况要如下面为准:
数据结构名.操做名();
这样才能区分操做,不至于致使乱码;
咱们能够来看下面的例子:算法
#include <iostream> #include <stack> #include <algorithm> using namespace std; int main() { stack<int>s; s.push(1); s.push(2); s.push(3); cout << "Top: " << s.top() << endl; cout << "Size: " << s.size() << endl; s.pop(); cout << "Size: " << s.size() << endl; if(s.empty()) { cout << "Is empty" << endl; } else { cout << "Is not empty" << endl; } return 0; }
其输出结果为:数组
Top: 3 Size: 3 Size: 2 Is not empty
这些操做在队列中与之相似:
另外在队列中还有:
front()表示 返回queue内的下一个元素 (q.front() )
back()表示 返回queue内的最后一个元素(q.back() )
这在队列中比较特有,在优先队列中也有所不一样:
q.top()表示返回优先队列的下一个元素
在vector动态数组中:
push_back(data_type a)表示将元素a插入最尾端
pop_back()表示将最尾端元素删除
v[i]表示 相似数组取第i个位置的元素(v[0] )
此时的输入,删除与栈、队列略有不一样。数据结构
另外关于排序问题:
sort:
头文件: #include
sort(begin, end);
sort(begin, end, cmp);
分为两种,第一种是系统默认从小到大对数据元素进行排序,第二种表示自定义排序方式,利用cmp函数进行自定义排序。
例:int num[] = {1,5,6,2,9};
bool cmp(int a, int b)
{
return a > b;
}
即自定义函数类型为bool型,读取a,b;返回a>b;
sort(num, num + 5, cmp);
进行如此排序后获得:
num[] = {9,6,5,2,1};svg
生成排序:
头文件: #include
bool next_permutation(begin, end);
改变区间内元素的顺序,产生下一个排列。
bool prev_permutation(begin, end);
产生前一个排列。
end为最后一个元素的下一个位置。函数
upper_bound 和 lower_bound:
upper_bound(begin, end, value);
返回>value的元素的第一个位置。
lower_bound(begin, end, value);
返回>=value的元素的第一个位置。
此处的位置在数组中可认为是数组的下标位置(注意数组下标为零时的情形)
例:num[] = {1,2,2,3,4,5};
lower_bound(num, num + 6, 2)
获得:num + 1
upper_bound(num, num + 6, 2)
获得:num + 3
在这里咱们也能够获得数组中指定元素元素相同的数量以及将其所有输出的一种方法。
只需利用以下所示方法便可:spa
int *x,*y; int s=1; x = lower_bound(num, num + 6, 2); y = upper_bound(num, num + 6, 2); while(x!=y) { s++; cout<<*x++<<" "; }
利用s进行计数,指针x,y进行输出便可。指针
另外关于STL的部分应用,如set和multiset 与map和multimap等问题会在接下来的博客中写到。code