STL简介
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。
STL是所有C++编译器和所有操作系统平台都支持的一种库。
该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。
为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
STL组成
一、容器(Container)
二、迭代器(Iterator)
三、算法(Algorithm)
四、函数对象(Function object)
五、适配器(Adaptor)
六、空间配制器(allocator)
1.容器类是容纳、包含一组元素或元素集合的对象;
向量(vector)
双端队列(deque)
列表(list)
集合(set)、多重集合(multiset)
映射(map)和多重映射(multimap)
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
void display(vector<int> &v2);
void display(vector<int>& v2)
{
vector<int>::iterator ite;//定义了一个迭代器,用来访问容器中的对象
for(ite=v2.begin();ite!=v2.end();ite++)
cout<<*ite<<" ";
cout<<endl;
}
int main(){
int i;
vector<int> v,v2(10); //定义了一个空的vector v1,长度为0;定义了一个包含10个元素的容器v2,每个元素的值为0
cout<<"The length of this Vector is "<<v.size()<<endl;
v.push_back(1); //在容量是0的容器中插入一个数据
display(v2);
for(i=0;i<10;i++) v2[i]=i; //对容器中的对象赋值
v2.push_back(10); display(v2);
return 0;
}
2.迭代器
提供了访问容器中对象的方法。(也可以用其他方法访问容器中的对象)
迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。
3.算法
是用来操作容器中的数据的函数模板。
例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。
函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
4.函数对象
所谓函数对象(function object)是重载了函数调用操作符(funiton-call operator())的对象,函数对象的优势在于能很好的满足STL的抽象要求。
5.适配器
将一个class的接口转换为另一个class的接口,使得原本因接口不兼容而不能合作的classes可以一起运作。分为容器适配器,迭代器适配器,函数对象适配器。
6.空间配制器
动态内存空间的分配和回收工作
几个需要注意的点:
STL容器分为两类(这两者通过数据在容器内的排列来区分)
(1)序列式容器
每个元素都有固定位置--取决于插入时机和地点,和元素值无关,
vector、deque、list;
(2)关联式容器
元素位置取决于特定的排序准则,和插入顺序无关
set、multiset、map、multimap;
vector与数组的区别
1.array 定义的时候必须定义数组的元素个数;而vector 不需要;
2.array 定义后的空间是固定的了,不能改变;而vector 要灵活得多,可再加或减.
3.vector有一系列的函数操作,非常方便使用。
4.数组和vector不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组;
set / multiset:集合
内部的元素依据其值自动排序
在vector,list, deque几个容器中插入数据元素时,插入的位置是确定的(最前,最后或是指定的某个位置上)
而在关联容器中插入数据时,根据插入数据元素的大小确定插入的位置(根据对象所属类中定义的(重载的)比较函数)
set内的相同数值的元素只能出现一次,
multiset内可包含多个数值相同的元素,
内部由二叉树(二叉链表,平衡二叉树,默认升序)实现,便于查找;
//map的使用
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
map<int,char> m;
m.insert(pair<int,char>(1,'1'));
m.insert(pair<int,char>(1,'2'));
cout<<m.size();
return 0;
}
ZOJ2104- Let the Balloon Rise
比赛又开始了。看见到处都是气球升起,多激动啊!告诉你一个秘密:裁判正在非常开心地猜测哪一题最受欢迎。当比赛结束时,他们统计每种颜色气球的数量就知道结果了。
输入
输入有多组测试例。
对每个测试例,第一个数字是N(0<N<1000),表示气球的数量。接下来N行,每行是一个气球的颜色,由小写字母构成的字符串表示,长度不超过15个。当N=0时,表示输入结束。
输出
对每个测试例输出一行,是表示最受欢迎的题目的气球颜色。
//比赛题目 气球
#include<iostream>
#include<map>
#include<iterator>
#include<string>
using namespace std;
int main(){
int n,iMax=0; //n题目的数量 iMax中间值
while(cin>>n&&n>0){
map<string,int> Balloon;
string s;
for(int i=0;i<n;i++){
cin>>s;Balloon[s]++;}//当气球颜色重复时 Balloon数组的值+1
map<string,int>::iterator point,loc;//定义迭代器
for(point=Balloon.begin();point!=Balloon.end();point++)
if(iMax < point->second){
iMax=point->second;
loc=point;}
cout<<loc->first<<endl;
return 0;
}
}
//优先队列
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> q;
q.push(1); q.push(10);
q.push(3); q.push(4);
while(!q.empty()){
int s;
s=q.top();
cout<<s<<" ";
q.pop();
}
return 0;
}
ZOJ1167-Trees on the Level
编写程序:给出一组二叉树,实现按层遍历每棵树。本题中二叉树的每个结点都是一个正整数,并且所有的二叉树都不超过256个结点。
按层遍历一棵树时,同一层上所有结点的数据从左到右输出,第k层的结点应该在第k+1层的结点之前输出。
//建立和遍历二叉树
#include <iostream>
#include <string>
#include <queue>
using namespace std;
class Node {
string value, path;
public:
void set(string v, string p){
value=v;
path=p;
}
string get_v() {
return value;
}
bool operator <(Node node) const{
if(path.length()>node.path.length ())
return true;
else
if(path.length()==node.path.length ())
return path>node.path;
else
return false;
}
};
int main(){
string node,value,path;
Node N;
priority_queue<Node> q;
int index1,index2;
while(cin>>node) {
index1=node.find_first_of(',');
value=node.substr(1,index1-1);
index2=node.find_first_of(')');
path=node.substr(index1+1,index2-index1-1);
N.set(value,path);
q.push(N);
}
while(!q.empty ()) {
N=q.top(); q.pop();
cout<<N.get_v ()<<" ";
}
cout<<endl; return 0; }