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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <cassert>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
template <class T, class charT = char, class traits = std::char_traits<charT>, class Distance = std::ptrdiff_t>
class istream_line_iterator: public std::iterator<std::input_iterator_tag, std::vector<T>, Distance, const std::vector<T>*, const std::vector<T>&> {
public:
typedef charT char_type;
typedef traits traits_type;
typedef std::basic_istream<charT,traits> istream_type;
istream_line_iterator(): in_stream(nullptr), ok(false) {}
istream_line_iterator(istream_type& s): in_stream(&s), ok(s) {}
istream_line_iterator(const istream_line_iterator& x) = default;
~istream_line_iterator() = default;
const std::vector<T>& operator*() const { return value; }
const std::vector<T>* operator->() const { return &(operator*()); }
istream_line_iterator<T,charT,traits,Distance>& operator++(){
read();
return *this;
}
istream_line_iterator<T,charT,traits,Distance> operator++(int){
istream_line_iterator tmp(*this);
read();
return tmp;
}
bool operator==(const istream_line_iterator<T,charT,traits,Distance> &rhs) const {
return (!ok&&!rhs.ok) || in_stream==rhs.in_stream;
}
bool operator!=(const istream_line_iterator<T,charT,traits,Distance> &rhs) const {
return !(operator==(rhs));
}
private:
void read(){
value.clear();
if(ok){
std::string line;
std::getline(*in_stream, line);
std::istringstream iss(line);
std::copy(std::istream_iterator<double>(iss), std::istream_iterator<double>(), std::back_inserter(value));
}
ok = in_stream && *in_stream;
}
std::basic_istream<charT,traits>* in_stream;
std::vector<T> value;
bool ok;
};
// En deux lignes :
int main(){
std::vector<std::vector<double> > matrice;
std::copy(istream_line_iterator<double>(std::cin), istream_line_iterator<double>(), std::back_inserter(matrice));
} |
Partager