一、不修改容器的算法
1、泛型find
类似于set模板类的find成员函数,但可作用于任何STL顺序容器类;为了使用find函数,容器必须有迭代器,元素必须存储成一种线性序列,这样++操作符才能移动迭代器来遍历整个容器。
find函数的源码定义:
//find.h
template <class Iterator, class T>
Iterator find(Iterator begin, Iterator end, const T &value) {
while(begin != end && *begin != value) {
++begin;
}
return begin;
}
从定义中我们可以看出它返回的是要查找的字符的开始位置。 下面通过一个例子来看一下find是怎么使用的:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<char> line;
cout<<"Enter a line of text:\n";
char next;
//输入字符串
cin.get(next);
while(next!='\n'){
line.push_back(next);
cin.get(next);
}
//创建一个迭代器where
vector<char>::const_iterator where;
//从头到尾循环查找
where=find(line.begin(),line.end(),'e');
vector<char>::const_iterator p;
cout<<"You entered the following before you entered you first e:\n";
for(p=line.begin();p!=where;p++) //输出要查找元素之前的内容
cout<<*p;
cout<<endl;
cout<<"You entered the following after that:\n";
for(p=where;p!=line.end();p++)
cout<<*p;
cout<<endl;
cout<<"End of demonstration.\n";
return 0;
}
/*
A line of text.
I will not!
*/
当输入A line of text.输出如下
从输出结果我们可以看出,当find找到查找的数据时返回的是第一个匹配项的位置,我们就可以通过迭代器遍历来输出前面和后面的字符串;
当输入I will not!时,输出如下:
当find没有找到匹配项时,返回的是第二个迭代器实参即line.end();
此外常用的不改变容器的泛型函数还有:
ForwardIterator find()、int count()、bool equal()、ForwardIterator1 search()、bool binary_search()
。具体函数的用法和时间复杂度可查。
二、会修改容器的算法
template <class T>
void swap(T& variable, T& variable2)
//交换 variable1和 variab1e2的值
template<class Forwarditerator, class Forwarditerator2>
Forwarditerator2 copy( Forwarditeratorl first1, Forwarditeratorl last1Forwarditerator2 first2 Forwarditerator2 last2)
//前条件:[fiSt1,1ast1]和[ first2,1ast2]这两个范围的长度一样
//动作:将位置[ first1,1ast1]的元素
//复制到位置[ first2,1ast210//返回1ast2
//时间复杂度:与范围[ first,1ast]的长度成正比的线性时间
template<class Forwarditerator class,T>
Forwarditerator remove( Forwarditerator first, Forwarditerator last,const T& target)
//从范围[ first,1ast]中删除等于 target的元素
//容器长度不变
//等于 target的那些被删除的值被移到范围[fist,1ast]的末尾
//这个范围有一个迭代器i,使所有有不等于 target的值都在范围[ first,i]中。返回1。
//时间复杂度:与范围[fist,1ast]的长度成正比的线性时间
template<class Bidirectionaliterator>
void reverse(Bidirectionaliterator first, Bidirectionaliterator last)
//逆转范围[ first,1ast]中元素的顺序
//时间复杂度:与范围[ first,1ast]的长度成正比的线性时间
template<class Randomaccessiterator>
void random shuffle(Randomaccessiterator first, Randomaccessiterator last)
//使用一个伪随机数生成器对范围[ first,1ast]中的元素进行随机排序
//时间复杂度:与范围[ first,1ast]的长度成正比的线性时间