首页 > 综合知识 > 正文

iterator it=set.iterator(iterator用法)

来源:综合知识2024-03-30 04:00:32
导读 您好,今日明帅来为大家解答以上的问题。iterator it=set.iterator,iterator用法相信很多小伙伴还不知道,现在让我们一起来看看吧!1、Iter...

您好,今日明帅来为大家解答以上的问题。iterator it=set.iterator,iterator用法相信很多小伙伴还不知道,现在让我们一起来看看吧!

1、Iterator使用:  一个ostream_iteartor的例子:    复制代码  1 #include   2  3 using namespace std;  4  5 template  6 class Ostream_iterator {  7 public:  8 Ostream_iterator(ostream &os,const char* s):  9 strm(&os), str(s){}  10 Ostream_iterator& operator++() {return *this;}  11 Ostream_iterator& operator++(int) {return *this;}  12 Ostream_iterator& operator*() {return *this;}  13 Ostream_iterator& operator=(const T& t)  14 {  15 *strm << t << str;  16 return *this;  17 }  18  19 private:  20 ostream* strm;  21 const char *str;  22 };  23  24 template  25 Out Copy(In start,In beyond,Out dest)  26 {  27 while(start != beyond)  28 *dest++ = *start++;  29 return dest;  30 }  31  32 int main()  33 {  34 Ostream_iterator oi(cout, " ");  35  36 int a[10];  37 for (int i = 0;i!=10;++i)  38 a[i] = i+1;  39 Copy(a,a+10,oi);  40  41 return 0;  42 }  复制代码  在这个例子中,我们简单的构造了一个ostream_iterator,并且使用了copy来输出..这个ostream_iterator和STL差别还是很大,不过功能上已经差不多了.我想读者们应该也能看懂代码吧,所以就不用多做什么解释了.  第二个例子中,我们讲构造一个istream_iterator.  对于一个istream_iterator来说,我们必须要存的是T buffer和istream *strm.不过由于istream的特殊性,我们必须知道buffer是否满,以及是否到达尾部,因此,我们的结构是这样的    复制代码  1 template   2 class Istream_Iterator{  3  4 private:  5 istream *strm;  6 T buffer;  7 int full;  8 int eof;  9 };  复制代码  对于构造函数来说,因为有eof的存在,因此,我们自然想到,我们的默认构造函数就应该把eof设为1.而对于有istream的iterator,都应该为0.    1 Istream_iterator(istream &is):  2 strm(&is),full(0),eof(0){}  3 Istream_iterator():strm(0),full(0),eof(1){}  对于我们的版本的istream_iterator来说,我们需要完成的功能有  进行取值操作(dereference),既*(p)  自增操作  比较  自增操作:  我们知道,在istream中,一旦获取到一个值了之后,我们将不在访问这个值.我们的iterator也要符合这样的要求,因此,我们通过full来控制.    复制代码  1 Istream_iterator& operator++(){  2 full = 0;  3 return *this;  4 }  5 Istream_iterator operator++(int){  6 Istream_iterator r = *this;  7 full = 0;  8 return r;  9 }  复制代码  Dereference:  对于解除引用操作来说,我们需要将流中缓存的值存入buffer内.同时,我们要判断读取是否到结尾,到了结尾则应当出错.  在这里我们写了一个私有函数fill(),这个将在比较的时候用到    复制代码  T operator*() {  fill();  assert(eof);//我们断定不应该出现eof  return buffer;  }  void fill(){  if (!full && !eof) {  if (*strm >> buffer)  full = 1;  else  eof = 1;  }  }  复制代码  比较:  对于比较来说,只有两个istream_iterator都同一个对象或者都处于文件尾时,这两个istream_iterator才相等.因此这里其比较对象为istream_iterator而不是const istream_iterator  复制代码  template  int operator==(Istream_iterator &p,Istream_iterator& q)  {  if (***.eof && ***.eof)  return 1;  if (!***.eof && !***.eof)  return &p == &q;  ***.fill();***.fill();  return ***.eof == ***.eof;  }  复制代码  最后的测试例子,读者可以把之前的copy和ostream_iterator拷下来  复制代码  int main()  {  Ostream_iterator o(cout,"");  Istream_iterator i(cin);  Istream_iterator eof;  Copy(i,eof,o);  return 0;  }  复制代码  结论:  iterator是STL实现所有算法已经其通用型的基础.通过对iterator分类,使得算法的使用者在使用时不需要知道具体实现就可知道算法对于参数的要求,形成一个通用的体系.。

本文就为大家分享到这里,希望小伙伴们会喜欢。

关键词:
版权声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。