내가 STL에 조예가 깊어서 글을 남기는 것이
아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면
지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다. - 최익필
이번 주제는 istream_iterator의 사용보다 istreambuf_iterator의 사용이 더 좋을 수가 있다. 는 것이다.
이유는 istream_iterator 가 operator>>를 이용하기 때문이다.
operator>>는 서식화 입력(formatted input)을 수행 한다.
쉽게 생각해서, 자질구레한 뒷처리를 다 해준다.
하지만 istreambuf_iterator는 stream 자체의 버퍼를 직접 건드려서 문자들을 바로 읽는다.
(s.rdbuf()->sgetc()를 호출해서 s의 다음 문자를 읽는다고 한다.)
그래서 더 빠르다!
그렇다면 어떻게 사용하는지 소스코드를 보자. 주석은 istream_iterator를 사용해본 흔적이다.
보면,
1. ifstream 객체 inputFile 을 생성(생성자 단계에서 파일을 읽을 수 있으나 명시적으로 open을 써준다.)
2. inputFile.open() 을 이용하여 파일에 접근 한다.
3. istreambuf_iterator<char>() 로 파일의 끝과
4. istreambuf_iterator<char>(inputFile) 을 이용하여 inputFile이 가리킨 파일의 첫번째 istreambuf_iterator를 만든다.
5. string 객체 생성시 이 이터레이터를 전달하여 다 밀어 넣는다.
6. 그리고 출력 한다.
주석의 내용
1. inputFile.unsetf( std::ios::skipws ); 는 istream_operator 를 이용 하려 할때, 띄어쓰기, 건너쓰기, 등의 문자까지 읽겠다는 표현이다.
2.
std::string fileData( ( std::istream_iterator<char>( inputFile ) ),
std::istream_iterator<char>( ) );
요것들은 위의 부분과 일맥 상통하나, operator>> 를 통하여 받아 들인다.
이것 만은 잊지 말자!
1. 서식화 입력 방식이 필요 없을 때는 istreambuf_iterator 를 고려하자.
2. ostreambuf_iterator 와 짝이니 이것도 알아 두자.^^
관련링크
http://www.filewiki.net/tc/entry/stdostreambuf_iterator-stdistreambuf_iterator 이유.
http://stdcxx.apache.org/doc/stdlibref/istream-iterator.html <-- istream_iterator 설명 영문
http://roadster.egloos.com/273828 <-- 나와 비슷한 내용
http://msdn.microsoft.com/en-us/library/daf5x844(VS.80).aspx <-- MSDN
http://www.cplusplus.com/reference/misc/iterator/istreambuf_iterator.html <-- istreambuf_iterator 영문
Stream Library 관계도
이번 주제는 istream_iterator의 사용보다 istreambuf_iterator의 사용이 더 좋을 수가 있다. 는 것이다.
이유는 istream_iterator 가 operator>>를 이용하기 때문이다.
operator>>는 서식화 입력(formatted input)을 수행 한다.
쉽게 생각해서, 자질구레한 뒷처리를 다 해준다.
하지만 istreambuf_iterator는 stream 자체의 버퍼를 직접 건드려서 문자들을 바로 읽는다.
(s.rdbuf()->sgetc()를 호출해서 s의 다음 문자를 읽는다고 한다.)
그래서 더 빠르다!
그렇다면 어떻게 사용하는지 소스코드를 보자. 주석은 istream_iterator를 사용해본 흔적이다.
보면,
1. ifstream 객체 inputFile 을 생성(생성자 단계에서 파일을 읽을 수 있으나 명시적으로 open을 써준다.)
2. inputFile.open() 을 이용하여 파일에 접근 한다.
3. istreambuf_iterator<char>() 로 파일의 끝과
4. istreambuf_iterator<char>(inputFile) 을 이용하여 inputFile이 가리킨 파일의 첫번째 istreambuf_iterator를 만든다.
5. string 객체 생성시 이 이터레이터를 전달하여 다 밀어 넣는다.
6. 그리고 출력 한다.
주석의 내용
1. inputFile.unsetf( std::ios::skipws ); 는 istream_operator 를 이용 하려 할때, 띄어쓰기, 건너쓰기, 등의 문자까지 읽겠다는 표현이다.
2.
std::string fileData( ( std::istream_iterator<char>( inputFile ) ),
std::istream_iterator<char>( ) );
요것들은 위의 부분과 일맥 상통하나, operator>> 를 통하여 받아 들인다.
이것 만은 잊지 말자!
1. 서식화 입력 방식이 필요 없을 때는 istreambuf_iterator 를 고려하자.
2. ostreambuf_iterator 와 짝이니 이것도 알아 두자.^^
관련링크
http://www.filewiki.net/tc/entry/stdostreambuf_iterator-stdistreambuf_iterator 이유.
http://stdcxx.apache.org/doc/stdlibref/istream-iterator.html <-- istream_iterator 설명 영문
http://roadster.egloos.com/273828 <-- 나와 비슷한 내용
http://msdn.microsoft.com/en-us/library/daf5x844(VS.80).aspx <-- MSDN
http://www.cplusplus.com/reference/misc/iterator/istreambuf_iterator.html <-- istreambuf_iterator 영문
'책 정리 > Effective STL' 카테고리의 다른 글
항목 34 : 정렬된 범위에 대해 동작하는 알고리즘이 어떤 것들인지 파악해 두자 (0) | 2008.09.03 |
---|---|
항목 33 : remove와 비슷한 알고리즘을 포인터의 컨테이너에 적용할 때에는 각별히 조심하자. (0) | 2008.09.02 |
항목 32 : 요소를 정말로 제거하고자 한다면 remove 류의 알고리즘에는 꼭 erase를 붙여 사용하자. (0) | 2008.09.02 |
항목 31 : 정렬시의 선택 사항들을 제대로 파악해 놓자. (0) | 2008.09.02 |
항목 30 : 알고리즘의 데이터 기록 범위(destination range)는 충분히 크게 잡자 (0) | 2008.07.28 |
항목 28 : reverse_iterator에 대응되는 기점 반복자(base iterator)를 사용하는 방법을 정확하게 이해하자. (1) | 2008.07.27 |
항목 27 : const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자. (0) | 2008.07.27 |
항목 26: const_iterator나 reverse_iterator, const_reverse_iterator도 좋지만 역시 쓸만한 것은 iterator이다 (0) | 2008.07.26 |
항목 25: 현재는 표준이 아니지만, 해쉬 컨테이너에 대해 충분히 대비해 두자 (0) | 2008.07.26 |
항목 24: map::operator[]나 map::insert는 효율 문제에 주의하여 선택하자 (5) | 2008.07.26 |
최근댓글