CSDN博客

img destructor

Iterators

发表于2004/10/13 17:01:00  448人阅读

分类: STL学习笔记

Iterators

1.Input Iterators
必须满足以下条件:
1)prefix++ and postfix++
2)operator!=
3)dereference* and only support read, not support write
4) operator ==
see in msdn
template< typename InputIterator > find(....)表明find算法需要Input Iterator。
see below:
template< typename T, typename InputIterator >
InputIterator find( InputIterator first, InputIterator last, const T& value )
{
 while ( first != last && *first !=value )
 {
  ++first ;
 }
 return first ;
}

2.Output Iterators
必须满足以下条件:
1)perfix++ and postfix++
2)dereference*, only support write
see below:
template< typename InputIterator, typename OutputIterator >
OutputIterator copy( InputIterator first, InputIterator last, OutputIterator result )
{
 while ( first != last )
 {
  *result = *first ;
  ++first ;
  ++result ;
 }
 return result ;
}

3.Forward Iterators
满足Input和Ouput Iterator的所有要求,同时可以储存一个forward Interator并利用它进行遍历,这样就可用于

multipass algorithm中。
see below:
template< typename ForwardIterator, typename T >
void replace< ForwardIterator first, ForwardIterator last, const T& x, const T& y )
{
 while ( first != last )
 {
  if ( *first == x )
   *first = y ;
  ++first ;
 }
}

4.Bidirectional Iterators
满足Forward Iterator的所有要求,同时提供prefix--和postfix--
list::iterator满足要求,由于list是一个double link list
such algorithm reverse require Bidirectional Iterators

5.Random access Iterators
满足Bidirectional Iterator的所有要求,同时提供以下操作(r,s为random access iterator,n为整数):
1)r+n和r-n
2)r[n],即*(r+n)
3)双向跳跃,即r+=n和r-=n
4)operator- with random access iterator,即r-s,得到一整数值
5)operator comparisons between random access iterator,即r<s,r>s,r<=s,r>=s,得到一bool值
vector、deque的iterator满足以上这些要求。
要求这样iterator的算法有binary_search、sort等

6.Insert Iterator
1)back_insert_iterator<Container> 利用push_back成员函数
2)front_insert_iterator<Container> 利用push_front成员函数
3)insert_iterator<Container> 利用insert成员函数
在copy时,假如没有给结果存放处分配足够的空间,就需要用到Insert Iterator。
如copy( vec.begin(), vec.end(), back_insert_iterator<vector<int> >(vec2) ) ;
标准提供了另一种简化:
template< typename Container>
inline back_insert_iterator<Container> back_inserter(Container& x)
{
 return back_insert_iterator<Container>(x) ;
}
则copy可以简化为copy( vec.begin(), vec.end(), back_inserter(vec2) ) ;
利用insert iterator,在赋值时,即*it=value时,此操作会转换成:
contain.push_back(value) ;
而it始终指向容器pass-the-end pointer,而operator++始终什么也不干。

由于vector并未提供push_front,因而front_insert_iterator不能对vector使用,而所有容器都提供了insert操

作,所以insert_iteartor能被所有容器使用。

7.istream_iterator和ostream_iterator
把他们当成input iterator和output iterator用即可,只是两个相关联的对象必须为输入流(istream&)和输出

流(ostream&)

阅读全文
0 0

相关文章推荐

img
取 消
img