Предыдущий пост -
Следующий пост -

Реализация istream_iterator.

Рубрика: C++, Дата: 21 July, 2013, Автор:

Реализуйте istream_iterator (параграф 19.2.6).

Да тоже сложно самостоятельно реализовать. Конечно сам я его не сделал, все перепечатал из примера, ну конечно свой написал, тот который из книги, щас попробую еще сделать самостоятельно.

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::basic_istream;
#include <iterator>
using std::istream_iterator;
using std::iterator;
using std::input_iterator_tag;
using std::char_traits;
#include <string>
using std::string;

template<class T,class Ch=char,class Tr=char_traits<Ch>, class Dist=ptrdiff_t>
class istream_iterator1 : public iterator<input_iterator_tag,T,Dist,const T*, const T&>
{
public:
	typedef Ch char_type;
	typedef Tr traits_type;
	typedef basic_istream<Ch,Tr> istream_type;

	//конструктор по умолчанию
	istream_iterator1():in(0){};
	//конструктор преобразования
	istream_iterator1(istream_type& s):in(&s){++*this;};//вызов оператора разыменования
	//конструктор копирования
	istream_iterator1(const istream_iterator1& e):in(e.in),value(e.value){}
	//деструктора
	~istream_iterator1(){};

	//операция разыменования
	const T& operator*() const{return value;}
	const T* operator->() const{return &value;}
	//префиксный
	istream_iterator1<T,Ch,Tr,Dist>& operator++()//возврат ссылки
	{
		if(in&&!(*in >>value)) in=0;//если in 
		return *this;
	}
	//постфиксный
	istream_iterator1<T,Ch,Tr,Dist> operator++(int)//возврат копии
	{
		istream_iterator1<T,Ch,Tr,Dist> temp(*this);//вызов конструктора копирования
		++*this;//меняем состояние, считываем данные
		return temp
	}
private:
	basic_istream<Ch,Tr>* in;
	T value;//значение которое будет записыватся из потока и сохранятся
};

/*template <class T, class charT=char, class traits=char_traits<charT>, class Distance=ptrdiff_t>
  class istream_iterator1 :
    public iterator<input_iterator_tag, T, Distance, const T*, const T&>
	//выходной итератор, расстояние, указатель, ссылка
{
  basic_istream<charT,traits>* in_stream;//указатель на поток ввода
  T value;//хз значение куда записывается

public:
  typedef charT char_type;//тип char
  typedef traits traits_type;//тип traits
  typedef basic_istream<charT,traits> istream_type;//выводной тип
  //конструктор преобразования
  istream_iterator1() : in_stream(0) {}//потому что по умолчанию 0
  istream_iterator1(istream_type& s) : in_stream(&s) { ++*this; }//
  //конструктор копирования
  istream_iterator1(const istream_iterator1<T,charT,traits,Distance>& x)
    : in_stream(x.in_stream), value(x.value) {}
  //декремент
  ~istream_iterator1() {}

  //разыменование возврат ссылки
  const T& operator*() const { return value; }
  //операция взятия указателя, возврат указателя
  const T* operator->() const { return &value; }
  //инкремент префиксный
  istream_iterator1<T,charT,traits,Distance>& operator++() {
    if (in_stream && !(*in_stream >> value)) in_stream=0;//если in_stream и не получилось прочитать value
    return *this;
  }
  //инкремент постфиксный
  istream_iterator1<T,charT,traits,Distance> operator++(int) {
    istream_iterator1<T,charT,traits,Distance> tmp = *this;//временный объект присваиваем тек состояние
    ++*this;//меняем текущее состояние
    return tmp;//возвращаем прошлое состояние
  }
};*/

int main()
{
	string str;

	istream_iterator1<string> end;
	istream_iterator1<string> in(cin);//сразу просит ввести значение

	str=*in;//просто возврат значения

	cout <<str;

	return 0;
}

Ну от сам пытался не подсматривая делать, да не чего не получилось, пришлось подсматривать.

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::basic_istream;
#include <iterator>
using std::iterator;
using std::input_iterator_tag;
using std::istream_iterator;
using std::char_traits;
#include <string>
using std::string;

template<class T,class Ch=char,class Tr=char_traits<Ch>,class Distance=ptrdiff_t>
class istream_iterator1
	: public iterator<input_iterator_tag,T,Distance,const T*,const T&>
{
	T value;
	basic_istream<Ch,Tr>* in;
public:
	typedef Ch char_type;
	typedef Tr traits_type;
	typedef basic_istream<Ch,Tr> istream_type;

	//конструктор по умолчанию
	istream_iterator1():in(0){};
	//конструктор преобразования
	istream_iterator1(istream_type& e):in(&e){++*this;}//вызов префиксного operator++()
	//конструктор копирования
	istream_iterator1(const istream_iterator1& e):in(e.in),value(in.value){}

	//разыменование
	T operator*(){return value;}
	//взятие указателя
	T* operator->(){return &value;}

	//префиксный инкремент
	istream_iterator1<T,Ch,Tr,Distance>& operator++()
	{
		if(in&&!(*it >>value)) in=0;
		return *this;
	}
	//постфиксный инкремент
	istream_iterator1<T,Ch,Tr,Distance> operator++(int)
	{
		istream_iterator1<T,Ch,Tr,Distance> tmp(*this);
		++*this;
		return tmp;
	}
};

int main()
{
	string str;
	
	istream_iterator1<string> end;
	istream_iterator<string> in(cin);

	str=*in;
	
	cout <<str<<endl;

	return 0;
}

[youtube]http://www.youtube.com/watch?v=6q0HPTJs36E[/youtube]

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *