https://godbolt.org/z/zjsTeYEfc
можно так конечно
https://github.com/p-ranav/csv2
for (const auto row: csv) вот поэтому и не люблю auto. смотришь на код и не понимаешь, что там std::string_view или std::string или что то ещё. происходит копирование памяти или нет. всё скрыто под auto
то есть намного лучше написать for (const std::string_view row : csv) там, где случайно окажется std::string?
да и получить ошибку компиляции, так как у std::string_view нет конструктора из rvalue
а вообще как-то так сложилось, что я не доверяю всяким мелким библиотекам
да там в коде веселье. operator* имеет сложность O(n) Row operator*() { Row result; result.buffer_ = buffer_; result.start_ = start_; result.end_ = end_; if (const char *ptr = static_cast<const char *>(memchr(&buffer_[start_], '\n', (buffer_size_ - start_)))) { end_ = start_ + (ptr - &buffer_[start_]); result.end_ = end_; start_ = end_ + 1; } else { // last row end_ = buffer_size_; result.end_ = end_; } return result; }
предложите свой вариант ленивого чтения с минималистичным интерфейсом
хорошей практикой является такие функции явно обозначать используя глагол, в котором описанно действие неконстантной сложности, например read_cells(), extract_cells(), но не get_cells() и тем более не operator* Ну или если очень хочется, то хотя бы сохранять результат поиска, что бы он был только при первом вызове оператора*
как будет выглядеть код - for (const auto cell : csv.read_cells())?
Ну так строку читать в operator++
да. так лучше будет
и в какой момент читать? в момент вызова read_cells прочитать вообще весь файл?
Можно. Парси. Пиши свой итератор парсера. Всё в твоих руках.
Обсуждают сегодня