STL( Standard Template Library)是C++程序设计语言标准模板库。
STL代码从广义上分为三类algorithm(算法)、container(容器)、iterator(迭代器)。
本文主要从关键性代码和注释中,自行体会STL中的主要函数的使用(容易)。
本文主要介绍在算法竞赛中常用的vector、map、set 和algorithm以及迭代器的简单使用
引言:
万能头文件:
#include<bits/stdc++.h>
使用此头文件可以省略所有其他头文件,可谓十分便捷。
1.向量(vector)
STL中的Vector是一个动态数组。
Vector是一个线性顺序结构,相当于数组,可以不预先指定数组的大小并自动扩展。
头文件:
#include<vector>
用迭代器访问容器Vector中的元素。
示例1:(应用)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> v(5);//注意此处的括号规定了容器大小 但可以扩容
int n=5;
for(int i=0;i<n;i++)
{
cin>>v[i];
}
v.push_back(666);
for(int i=0;i<=n;i++)
{
cout<<v[i]<<" ";
}
cout<<endl;
cout<<v.size()<<endl;
}
2.迭代器:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> v2;
int n=5;
int x;
for(int i=0;i<n;i++)
{
cin>>x;
v2.push_back(x);//将x追加到容器末尾
}
for(int i=0;i<n;i++)
{
cout<<v2[i]<<" ";//使用下表访问元素
}
cout<<endl;
vector <int> ::iterator p;//使用迭代器引用元素
for(p=v2.begin();p!=v2.end();p++)
{
cout<<*p<<" ";
}
cout<<endl;
cout<<v2.size()<<endl;
v2.pop_back();//删除容器尾元素
cout<<v2.size()<<endl;
}
运行结果:
2.映射(map)
map内部数据的组织是一颗红黑树,具有对数据自动排序的功能,所以map内部所有的数据的Key都是有序的。
头文件:
#include <map>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
map<string,int> m;
m.insert(make_pair("b",123));
m.insert(make_pair("c",321));
m.insert(make_pair("a",456));
m["d"]=789;
map<string,int>::iterator pm;
for(pm=m.begin();pm!=m.end();pm++)
cout<<pm->first<<" "<<pm->second<<endl; //first表示key second表示值
cout<<m.size()<<endl;
}
运行结果:
显然:排序顺序是按照key从小到大。
3.集合(set)
集合的特殊性在于它所包含的元素的唯一性,集合中的元素按照一定顺序排序。
定义和使用类似于vector。
头文件:
#include <set>
使用示例:
#include<bits/stdc++.h>
using namespace std;
int main()
{
set<string> s;
s.insert("orange");//插入元素
s.insert("apple");
s.insert("banana");
s.insert("orange");
set<string>::iterator sp;
for(sp=s.begin();sp!=s.end();sp++)
cout<<*sp<<endl;
cout<<s.size()<<endl;
}
运行:
显然:元素不重复,且已经按照从小到大排序 。
【注】:
迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->,*,++ --等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升,提供了比指针更高级的行为,相当于一种智能指针。
4.算法(algorithm)
algorithm是C++的标准算法库,它主要应用在容器上。 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性。
因此,任何数据结构都能使用这套算法库,只要它具有相应的迭代器类型。
头文件:
#include<algorithm>
常用的成员函数:
max()
:求两个数最大值min()
:求两个数最小值abs()
:求一个数的绝对值
交换函数:swap()
排序函数:sort()(默认升序)常用
欲降序,需要自定义函数bool cmp();
应用实例:
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;//意思是:若a>b,则a的优先级更大! 也就是说大的在前面。
}
int main()
{
int a,b;
cin>>a;
cin>>b;
cout<<max(a,b)<<endl;
cout<<min(a,b)<<endl;
swap(a,b);
cout<<a<<" "<<b<<endl;
int d[10]={1,6,5,4,2,3,7,9,8,10};
sort(d,d+10);//加的是容器内的元素总个数
for(int i=0;i<10;i++)
cout<<d[i]<<" ";
sort(d,d+10,cmp);//cmp后不加实参
for(int i=0;i<10;i++)
cout<<d[i]<<" ";
}
运行:
以上是STL常用的类和库函数的调用,但并不全面,属于解决算法竞赛题的基本功。
【注】:容器中的栈、队列、优先队列和列表并未介绍。