일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 예외
- implicit conversion
- operator new
- 오블완
- more effective c++
- 루아
- 언리얼
- effective stl
- 상속
- virtual function
- resource management class
- 참조자
- Smart Pointer
- 암시적 변환
- 스마트 포인터
- exception
- 티스토리챌린지
- 영화
- 메타테이블
- c++
- 반복자
- Effective c++
- reference
- 영화 리뷰
- UE4
- lua
- 비교 함수 객체
- 게임
- 다형성
- 함수 객체
Archives
- Today
- Total
스토리텔링 개발자
[Effective STL] 29. istream_iterator vs istreambuf_iterator 본문
개발/Effective STL
[Effective STL] 29. istream_iterator vs istreambuf_iterator
김디트 2024. 12. 16. 11:15728x90
항목 29. 문자 단위의 입력에는 istreambuf_iterator의 사용도 적절하다
텍스트 파일을 string 객체로
ifstream inputFile("interastingData.txt");
// inputFile을 읽어 fileData에 저장한다.
// 하지만 정확한 답은 아니다.
// 문법의 경우 항목 6 참조
string fileData((istream_iterator<char>(inputFile)), istream_iterator<char>());
- 이 경우 공백(whitespace) 문자를 객체에 복사하지 못한다..
- istream_iterator는 스트림을 읽을 때 operator<< 함수를 사용한다.
- 이 연산자 함수는 공백 문자를 스킵한다.
ifstream inputFile("interastingData.txt");
inputFile.unsetf(ios::skipws); // 공백 문자를 건너뛰지 않도록 처리
string fileData((istream_iterator<char>(inputFile)), istream_iterator<char>());
- 하지만 이 코드는 그렇게 빠르지 않다.
- istream_iterator의 operator<< 함수는 서식화 입력(formatted input)을 수행한다.
- 즉, 선제적으로 여러가지 처리를 수행한다.
- operator<< 호출 시 필요한 전처리
- 마무리 동작을 해주는 sentry라는 특수한 iostream 객체 생성
- 동작에 영향을 미치는 스트림 플래그 체크
- 읽는 도중 발생한 에러를 종합적으로 체크
- 문제가 생겼을 때 스트림의 예외 마스크(exception mask)를 체크하여 예외 발생 여부 결정
- 그냥 입력 스트림으로부터 문자를 뽑아내는 일에 너무 과중한 처리들이 함께 처리된다.
istreambuf_iterator
- 이 반복자는 istream_iterator처럼 쓸 수 있다.
- 하지만 operator<<로 문자를 읽는 게 아니라, 스트림 자체의 버퍼를 직접 건드려서 문자들을 바로 읽어들인다.
- istreambuf_iterator<char> 객체는 s.rdbuf()->sgetc()를 호출해서 s의 문자를 읽는다.
- 위 코드를 수정하는 것은 매우 간단하다.
ifstream inputFile("interastingData.txt");
// istream_iterator -> istreambuf_iterator 로만 변경했다.
string fileData((istreambuf_iterator<char>(inputFile)), istreambuf_iterator<char>());
- istream_iterator와 비교할 때 이 반복자의 속도는 무척 빠르다.
- 당연히 ostreambuf_iterator 역시 존재하며, ostream_iterator보다 일반적으로 빠르다.
728x90
'개발 > Effective STL' 카테고리의 다른 글
[Effective STL] 31. 상황별 정렬 선택하기 (0) | 2024.12.18 |
---|---|
[Effective STL] 30. 알고리즘 사용 시 목적지 범위(destination range) 주의 (0) | 2024.12.17 |
[Effective STL] 28. 반복자 base() 유의점 (0) | 2024.12.13 |
[Effective STL] 27. const_iterator를 iterator로 바꾸기 (0) | 2024.12.12 |
[Effective STL] 26. 기본 iterator 선호하기 (0) | 2024.12.11 |
Comments