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.