2 분 소요

1. stream iterator

  • 입/출력 스트림에서 요소를 읽거나 쓰기 위한 반복자
    #include <iterator>
    
  • 4가지 종류의 반복자 제공
    • ostream_iterator
      • basic_ostream
      • 서식화된 출력
    • ostreambuf_iterator
      • basic_ostreambuf
      • CharT 출력
    • istream_iterator
      • basic_istream
      • 서식화된 입력
    • istreambuf_iterator
      • basic_istreambuf
      • CharT 입력
      #include <iostream>
      #include <list>
      #include <iterator>
      using namespace std;
        
      int main()
      {
          int n = 10;
        
          cout << n << endl;
        
          ostream_iterator<int> p(cout, ", ");
        
          *p = 20; // cout << 20 << ", "
          *p = 30; // cout << 30 << ", "
        
          list<int> s = {1,2,3};
        
          copy(begin(s), end(s), p);
        
          fill_n(p, 3, 0);
      }
    

    ## 2. ostream_iterator

  • 생성 방법

      ostream_iterator(ostream_type& stream, const CharT* delimeter)
      ostream_iterator(ostream_type& stream)
    
  • 연산
    • ++
    • *
    • =
#include <iostream>
#include <iterator>
#include <fstream>
using namespace std;

int main()
{
    ofstream f("a.txt");

    ostream_iterator<int> p(f, ", ");

    // ostream_iterator<int> p(cout); //Null

    *p = 20;
    ++p;
    *p = 30;
}

3. ostreambuf_iterator

  • rdbuf()
    • stream 객체가 사용하는 streambuf의 포인터를 반환하는 stream의 멤버 함수
  • basic_streambuf<>::sputc()
    • streambuf에 한 문자를 출력하는 함수
  • ostream_iterator
    • stream(cout)을 사용해서 화면 출력 - 서식화된 출력
  • ostreambuf_iterator
    • streambuf를 사용해서 화면 출력 - 문자 타입만 출력

image

#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    // ostreambuf_iterator<int> p(cout); // 에러, char형만 받을 수 있음
    ostreambuf_iterator<char> p(cout);

    *p = 65; // 아스키코드로 변환 A

    streambuf* buf = cout.rdbuf();
    buf->sputc(65); // A를 화면 출력

    ostreambuf_iterator<char> p(cout);
    *p = 'Z';
    ostreambuf_iterator<char> p2(cout.rdbuf());
    *p2 = 'A';

    ostreambuf_iterator<wchar_t> p3(wcout.rdbuf());
    *p3 = L'B';
}

4. ostream_iterator 구현해보기

#include <iostream>
#include <iterator>
using namespace std;

template<typename T,
         typename CharT = char,
         typename Traits = char_traits<CharT>>
class eostream_iterator
{
    // ostream* stream;
    basic_ostream<CharT, Traits>* stream;
    const CharT* delimeter;
public:
    using iterator_category = output_iterator_tag;
    using value_type = void;
    using pointer = void;
    using reference = void;
    using difference_type = void;

    using char_type = CharT;
    using traits_type = Traits;
    using ostream_type = basic_ostream<CharT, Traits>;

    eostream_iterator(ostream& os, const CharT* const deli = 0)
        : stream(&os), delimeter(deli) 
    {}

    eostream_iterator& operator*() { return *this; }
    eostream_iterator& operator++() { return *this; }
    eostream_iterator& operator++(int) { return *this; }
    eostream_iterator& operator=(const T& v) {
        *stream << v;
        if (delimeter != 0)
            *stream << delimeter;
        return *this;
    }  
};

int main()
{
    eostream_iterator<int> p(cout, ", ");
    *p = 10; // ( p.operator*() ).operator=(10)

    istream_iterator<int> p1(cin);
    int n = *p1;

    cout << n << endd;
}

5. istream_iterator

  • 입력 받을 때
    • cin : 버퍼에 입력된 whitespace를 제외하고 입력 받음
    • streambuf에서 직접 꺼내오면 whitespace를 입력 받을 수 있음

참고

codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.
코드누리


This is personal diary for study documents.
Please comment if I'm wrong or missing something else 😄. 

Top

댓글남기기