std::vector<double> read_puzzle_coords(std::istream & ins) { std::vector<double> dvec; std::copy( std::istream_iterator<double>(ins), std::istream_iterator<double>(), std::back_inserter(dvec)); return dvec; }
typedef std::pair<double, double> point; typedef std::vector<point> point_vec; std::istream & operator >> (std::istream & is, point & p) { double f, s; if (is >> f >> s) p = std::make_pair(f, s); return is; } point_vec read_puzzle_pts(std::istream & ins) { point_vec pts; std::copy( std::istream_iterator<point>(ins), std::istream_iterator<point>(), std::back_inserter(pts)); return pts; }
CC
, but not on g++
.
point_vec read_puzzle_pts(std::istream & ins) { point_vec pts; std::copy( std::istream_iterator<point>(ins), std::istream_iterator<point>(), std::back_inserter(pts)); if (!ins.eof()) { std::cout << "Bad puzzle outline.\n"; exit(EXIT_FAILURE); } return pts; }
std::istream & operator >> (std::istream & ins, point & p) { double f, s; if (ins >> f) if (ins >> s) p = std::make_pair(f, s); else ins.clear(std::ios::badbit); return ins; }
bool read_tan( std::istream & ins, point_vec & tan) { std::string ln; if (!read_next_nonblank_line(ins, ln)) return false; std::istringstream iss(ln); tan.clear(); std::copy( std::istream_iterator<point>(iss), std::istream_iterator<point>(), std::back_inserter(tan)); if (!ins.eof()) { std::cout << "Bad tan read.\n"; exit(EXIT_FAILURE); } return true; }
tan
.
template<class Cont> class overwrite_iterator : public std::iterator< // parent class std::output_iterator_tag, // iterator kind typename Cont::value_type> // *i type { public: // To come. private: // The container involved. Cont & cont; // The actual iterator used. typename Cont::iterator iter; };
typename
to identify types.
overwrite_iterator<ctype> oii1(c), oii2(c, ++c.begin());
explicit overwrite_iterator(Cont & x) : cont(x), iter(x.begin()) { } overwrite_iterator( Cont & x, typename Cont::iterator it) : cont(x), iter(it) { }
overwrite_iterator<point_vec> good, bad; point_vec pts;bad = pts;good = overwrite_iterator<point_vec>(pts);
++
and l-lvalue *
.
overwrite_iterator & operator * () { return *this; } overwrite_iterator & operator ++ () { return *this; } overwrite_iterator & operator ++ (int) { return *this; }
operator typename Cont::iterator () { return iter; }
overwrite_iterator & operator = ( const typename Cont::value_type & val) { if (iter == cont.end()) { cont.push_back(val); iter = cont.end(); } else *iter++ = val; return *this; }
if (iter == cont.end()) { cont.push_back(val); ++iter; }
overwriter(pts)
instead of
overwrite_iterator< std::vector<(point> >(pts);
template<class Cont> overwrite_iterator<Cont> overwriter(Cont & x) { return overwrite_iterator<Cont>(x); } template<class Cont> overwrite_iterator<Cont> overwriter( Cont & x, typename Cont::iterator it) { return overwrite_iterator<Cont>(x, it); }
bool read_tan( std::istream & ins, point_vec & tan) { std::string ln; if (!read_next_nonblank_line(ins, ln)) return false; std::istringstream iss(ln); std::copy( std::istream_iterator<point>(iss), std::istream_iterator<point>(), overwriter(tan)); if (!ins.eof()) { std::cout << "Bad tan read.\n"; exit(EXIT_FAILURE); } return true;
tan.clear()
.
tan.erase()
to remove the extra elements.
point_vec::iterator e = std::copy( std::istream_iterator<point>(iss), std::istream_iterator<point>(), overwriter(tan)); tan.erase(e, tan.end());
clear()
before, call erase()
after - what's the
difference?
C/C++ Tip # 11: Overwrite Iterator by Ray Virzi in C/C++ User's Journal, December, 2002 (Vol. 20, No. 12)
? :
expression were wrong.
This page last modified on 19 December 2002.