1

ファイルからトークン化できる文字列を作成しようとしています。機能するのは

boost::iostreams::stream_buffer<boost::iostreams::mapped_file_source> file("file.txt");
boost::char_separator<char> sep(",");
std::string buf(file->begin(),file->end())
boost::tokenizer<boost::char_separator<char>> tokeniser(buf,sep);

しかし、私ができると思っていた文字列にファイルのバッファを不必要にコピーすることはしません:

boost::iostreams::stream_buffer<boost::iostreams::mapped_file_source> file("file.txt");
boost::iterator_range<const char*> it = make_iterator_range(file->begin(),file->end());
boost::tokenizer<boost::char_separator<char>> tokeniser(it,sep);

また

std::istringstream buf;
buf.rdbuf()->pubsetbuf(const_cast<char*>(file->data()),file->size());
boost::char_separator<char> sep(",");
boost::tokenizer<boost::char_separator<char>> tokeniser(buf,sep);

私も試しました

boost::tokenizer<boost::char_separator<char>> tokeniser(boost::as_literal(file->data()),sep);

しかし、トークナイザーがイテレーターを受け入れないたびに

これを行う効率的なポータブルな方法はありますか?

編集可能な答えこれを解決すると思います

私が考えたのは、istreamイテレータを使用して非コピーを達成することです.100%ではありませんが、イテレータが反復し、基礎となるデータをコピーしないことをかなり確信しています.

boost::iostreams::stream_buffer<boost::iostreams::mapped_file_source> file("names.txt");
std::istream in(&file);
std::istream_iterator<std::string> iter(in);
boost::char_separator<char> sep(",");
boost::tokenizer<boost::char_separator<char>> tokeniser(*iter,sep);

考え?それとももっと良いものがありますか?

4

0 に答える 0