Tanky WooRSS

《C++标准程序库》学习笔记5 -- 第七章

27 Jan 2011
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

迭代器的分类及其能力: input迭代器只能读取元素一次。如果复制input迭代器,并使原迭代器和新产生副本都向前读取,可能会遍历到不同的值。output迭代器类似。

C++不允许修改任何基本类型(包括指针)的暂时值,但对于struct, class则允许。

所以:

vector ivec; 
sort(++ivec.begin(), ivec.end());

也许会失败,这取决于vector的实作版本。

C++标注库为迭代器提供的三个辅助函数 ①. advance() 前进(或后退)多个元素

#include 
void advance(InputIterator & pos, Dist n)

注:对于Bidirectional迭代器或Random Access迭代器,n可以为负值,表示后退 ②. distance()  处理迭代器之间的距离

#include  
Dist distance (InputIterator pos1, InputIterator pos2)

③. iter_swap() 可交换两个迭代器所指内容

#include  
void iter_swap(ForwardIterator pos1, ForwardIterator pos2)

注:不是交换迭代器!

迭代器配接器之Reverse(逆向)迭代器 对于reverse iterator,他实际所指位置逻辑所指位置并不一样: eg.

#include  
#include  
#include  
using namespace std; 

int main() 
{ 
    vector coll; 
    for (int i=1; i<=9; ++i) { 
        coll.push_back(i); 
    } 

    vector::iterator pos; 
    pos = find (coll.begin(), coll.end(),5); 
    cout << "pos: " << *pos << endl; 

    vector::reverse_iterator rpos(pos); 
    cout << "rpos: " << *rpos <pos: 5 
rpos: 4

[![iter1](https://images.tankywoo.com/oldblog/2011/01/iter1_thumb.jpg)](https://images.tankywoo.com/oldblog/2011/01/iter1.jpg)

这是reverse iterator的内部机理图(*)

[![iter2](https://images.tankywoo.com/oldblog/2011/01/iter2_thumb.jpg)](https://images.tankywoo.com/oldblog/2011/01/iter2.jpg)

可以看出,[begin(), end() )  [rbegin(), rend() )的区间是一样的!
base()函数可以将逆向迭代器转回正常迭代器

eg.

```cpp

pos = rpos.base();

注:

vector::reverse_iterator rpos(pos); 

可以将迭代器赋值给逆向迭代器从而隐式转换,而将逆向迭代器转换成普通迭代器则只能用base()函数。 这一块内容颇多,要认真把P264~P270看看。

迭代器配接器之Insert(安插)迭代器 iter3

迭代器配接器之Stream(流)迭代器 Osream流迭代器: iter4 Istream流迭代器 iter5 综合性的代码:

// Author: Tanky Woo 
// Blog:   www.WuTianQi.com 
#include  
#include  
#include 

using namespace std; 

int main() 
{ 
    istream_iterator cinPos(cin); 
    istream_iterator cinEnd; 
    ostream_iterator coutPos(cout, " "); 

    while(cinPos != cinEnd) 
        *coutPos++ = *cinPos++; 

    return 0; 
}