STL_算法
算法是STL的重要组成部分。STL提供了大约100个实现算法的模板函数,用户可以通过调用算法模板完成所需的功能。
一般来说,STL中的算法部分主要由头文件< algorithms>,< numeric>,< functional>组成。其中,头文件< algorithms>由模板函数组成,常见的函数涉及比较,交换,查找,排序等。
sort在< algorithm>库里面,原型如下:
下面是一个使用STL中排序算法的实例:
- sort在< algorithm>库里面,原型如下:
template < class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
- sort函数有两种形式,一种有两个参数,一种有三个参数,sort的前两个参数是起始地址和终止地址,表示对a[0] a[1] a[2] … a[n-1] 排序。
- sort函数中:返回值为false,交换;为true,不交换。
- 第三个参数是当你需要按照某种特定方式进行排序时,你需要给sort指定比较函数:
bool cmp(int a,int b) { return a<b; }
然后调用:sort(vect.begin(),vect.end(),cmp);
后可以进行排序。
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
class myclass{
public:
int first;
int second;
myclass(int a,int b):first(a),second(b){ }
//这里重载了<运算符,使类之间的first,second也可以用" < "比较大小
bool operator<(const myclass& m)const //bool类型,只返回0或1
{
return first<m.first;
}
};
bool less_second(const myclass& m1,const myclass& m2)
{
//sort三个参数的实现是:为false,交换;为true,不交换。
return m1.second<m2.second; //即这里是升序排序
}
int main()
{
vector<myclass> vect; //创建了一个vect向量容器,类模板vector中传递的实际类型是myclass类
for(int i=0;i<10;i++) //循环创建了10个对象,并给每个对象的first和second都赋了不同的值
{
myclass my(10-i,i*3);
vect.push_back(my); //向末端插入对象
}
for(int i=0;i<vect.size();i++) //打印容器内的信息
{
cout<<"("<<vect[i].first<<","<<vect[i].second<<")"<<endl;
}
sort(vect.begin(),vect.end()); //调用排序算法,传递了向量开始与结束元素的游标
cout<<"after sorted by first:"<<endl;
for(int i=0;i<vect.size();i++)
{
cout<<"("<<vect[i].first<<","<<vect[i].second<<")"<<endl;
}
cout<<"after sorted by second:"<<endl;
sort(vect.begin(),vect.end(),less_second);
for(int i=0;i<vect.size();i++)
{
cout<<"("<<vect[i].first<<","<<vect[i].second<<")"<<endl;
}
return 0;
}
运行结果:
迭代器
迭代器实际上一种泛化指针,如果一个迭代器指向了容器中的某一成员,那么迭代器可以通过自增和自减来遍历容器中的所有成员。迭代器是联系容器和算法的媒介,是算法操作容器的接口。
简单来说,STL提供的所有算法几乎都是通过迭代器存取元素序列进行工作的,每一个容器都定义了它本身所专有的迭代器,用以存取容器中的元素。
STL中的迭代器主要由头文件< utility>,< iterator>,< memory>组成。其中,< utility>包括了贯穿使用在STL中的几个模板的声明,< iterator>头文件中提供了迭代器使用的许多方法。< memory>头文件中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。