2014-09-01 2 views
1

(예 vector, deque, map), 나는C++ 스트림 반복자 I 컨테이너 유형, C++에서 이해 것과

vector<int>::iterator 
map<int,int>::const_iterator 

같은 구문을 사용하여 반복자 유형을 얻을 그리고 실제 반복자를 얻을 수 있습니다 그러나

stuff.begin() 

같은 방법을 통해 첫 번째 요소로 흐름 (예 ifstream)의 경우, 인터페이스는 약간 다른 것으로 보인다; 내가 이해하는 바로는

streambuf_iterator<char>(fin) 
stream_iterator<int>(fin) 

를 작성하여 반복자를 얻을 수 ifstream 어떤 방법 begin<int> 또는 beginbuf 내가 처음 vector 내 경험에서 기대했던 방법이 없습니다.

기술적 인 측면과 역사적 측면이 다른 이유는 무엇입니까? istream 반복자가 vector 및 그 ilk와 비슷한 동작을하는 경우 새로운 코더가 더 직각이되고 더 쉽지 않을까요?

+3

대부분 역사적입니다. 반복자가 등장하기 몇 년 전부터 iostream이 사용되어 왔습니다. 실용적인 문제가 있습니다. 벡터가 한 유형에 대해 인스턴스화되므로 iterator의 유형이됩니다. 스트림의 경우 임의 유형의 객체를 스트림이 보유 할 수 있으므로 읽기/쓰기 계획을 직접 지정해야합니다. –

답변

0

여기서 주목해야 할 중요한 차이점은 반복자를 사용하려는 구조의 차이점이라고 생각합니다. 언급 한 구조, vector, dequemap은 유연하지만 포함 된 데이터의 상태는 비교적 정적입니다. 반면에 stream은 매우 유동적이며 변화가없는 것이므로 stream이어야합니다.

이제 스트림이 "흐르고"계속 변경되기 때문에 데이터 개체로 볼 때 스트림에 begin 또는 end이 없습니다. 분명히이 관점은 절대적인 것은 아니지만, 이것은 stream 반복자를 설계 할 때 따라 오는 이상주의라고 생각합니다.

0

사실 스트림은 벡터가 아닙니다. 강을 상상할 수 있습니다. 강에는 "처음"물이없고 "결말"물이 없습니다 (물이 마르지 않는 것 제외). 벡터는 동일한 객체의 행입니다. 그 행은 시작과 끝이 있습니다.

파일의 시작과 끝은 물론 있지만 스트림이 파일을 추상화하려는 방식이 아닙니다.