迭代器(Iterators)
在上面C数组逆向排序的例子中,reverse的参数明显是double*类型。如果用reverse逆向排序vector或list, 参数又是什么呢?也就是说reverse申明的是什么参数,还有v.begin
()和v.end()返回什么?
答案就是reverse的参数是迭代器(iterators)就是指针对一般化。指针本身就是迭代器,所以reverse可以逆向排序C数组中的元素。类似的,vector申明了嵌套类型iterator和
const_iterator。在上面的例子中,v.begin()和v.end()的返回类型是 vector<int>::iterator。也有一些迭代器,像istream_iterator和ostream_iterator,它们与容器是没有
关联的。
迭代器是让算法与容器分离成为可能:算法是模板,需要被迭代类型参数化使用,所以它们不会限制在某一种容器类型。考虑,例如,如何写一个算法在一个范围内进行线性搜索
。下面是STL中find算法。
template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T&value)
{
while(first != last && *first != value)++first;
return first;
}
find函数需要三个参数:两个迭代器定义一个范围,还有一个value值查找。它在[first,last)这个范围内从开始到最后一个一个检查迭代,当它找到一个迭代指向的值跟我们寻找
的值相同时或者它到达范围的结束时,就停止查找。
first和last被申明为InputIterator类型,而InputIterator是一个模板参数。也就是说实际上没有一个类型为InputIterator:当你调用find函数时,编译器会把形式参数
InputIterator和T替换成实际类型参数。如果find函数的前面两个参数类型为int*,第三个参数类型为int,那么就像调用下面的函数。
int* find(int* first, int* last, const int& value)
{
while(first != last && *first != value)++first;
return first;
}
下一节 《概念与建模》
posted on 2012-02-22 14:52
canaan 阅读(1222)
评论(0) 编辑 收藏 引用 所属分类:
外文翻译