Using Iterator Adaptors

 
實習目標 有了 vector<type> 容器,也看過 vector<type>::iterator 的基本用法,我們可以很容易地運用 iterator 把容器裡的資料輸出到 ostream 輸出串流,不過這裡介紹一種運用 iterator adaptors 的方法
 

ostream_iterator

運用 ostream_iteratorcopy 把容器裡的資料輸出到 ostream 輸出串流

#include <iostream>     // std::cout
#include <iterator>     // std::ostream_iterator
#include <vector>       // std::vector
#include <algorithm>    // std::copy

int main () 
{
  std::vector<int> myvector;
  for (int i=1; i<10; ++i) 
       myvector.push_back(i*10);

  std::ostream_iterator<int> out_it(std::cout,", ");
  std::copy( myvector.begin(), myvector.end(), out_it );
  return 0;
}

輸出如下:

10, 20, 30, 40, 50, 60, 70, 80, 90,

istream_iterator

運用 istream_iterator 讀取輸入串流

例如:

#include <iostream>     // std::cin, std::cout
#include <iterator>     // std::istream_iterator

int main() 
{
  double value1, value2;
  std::cout << "Please, insert two values: ";

  std::istream_iterator<double> eos;              // end-of-stream iterator
  std::istream_iterator<double> iit(std::cin);    // stdin iterator

  if (iit!=eos) value1 = *iit;

  ++iit;
  if (iit!=eos) value2 = *iit;

  std::cout << value1 << '*' << value2 << '=' << (value1*value2) << '\n';

  return 0;
}

輸出如下:

Please, insert two values: 2 32
2*32=64

reverse_iterator

也可以運用 reverse_iterator 把容器裡的資料用相反的順序來存取

例如:

#include <iostream>     // std::cout
#include <iterator>     // std::reverse_iterator
#include <vector>       // std::vector

int main() 
{
  std::vector<int> myvector;
  for (int i=0; i<10; i++) myvector.push_back(i);

  typedef std::vector<int>::iterator iter_type;
                                                         // ? 0 1 2 3 4 5 6 7 8 9 ?
  iter_type from(myvector.begin());                      //   ^
                                                         //         ------>
  iter_type until(myvector.end());                       //                       ^
                                                         //
  std::reverse_iterator<iter_type> rev_until(from);      // ^
                                                         //         <------
  std::reverse_iterator<iter_type> rev_from until);      //                     ^

  std::cout << "myvector:";
  while (rev_from != rev_until)
    std::cout << ' ' << *rev_from++;
  std::cout << '\n';

  return 0;
}

輸出如下:

myvector: 9 8 7 6 5 4 3 2 1 0

C++ 物件導向程式設計課程 首頁

製作日期: 06/19/2015 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon