STL简单应用:
STL中的部分简单应i用包括栈(stack)、队列(queue)、其中队列还有特殊的优先队列(priority_queue);还有vector-动态数组、其次还有sort排序以及生成排序等多种排序方法,其中包括upper_bound和lower_bound的寻址排序法方便返回特定元素的第一个位置。其次还有set和multiset 与map和multimap等简单应用问题。
首先介绍一下栈、队列、以及优先队列、动态数组的共同点与不同点:
我们先来认识一下栈(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};
生成排序:
头文件: #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
在这里我们也可以得到数组中指定元素元素相同的数量以及将其全部输出的一种方法。
只需利用如下所示方法即可:
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等问题会在接下来的博客中写到。