随笔 - 46  文章 - 39  trackbacks - 0
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

常用链接

留言簿(2)

随笔分类

随笔档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

迭代器(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 阅读(1213) 评论(0)  编辑 收藏 引用 所属分类: 外文翻译

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理