teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

e

2020/12/20 05:47

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -1,3 +1,11 @@
1
1
  まず、`ifstream`を使うのをやめましょう。C++のiostream系のバッファリングはあまり効率的ではありません。変わりにmemmory mapped ioを使います。[Unix系なら`mmap`、Windowsではなんかごちゃごちゃいろいろ呼び出して実現します。](http://nnabeyang.hatenablog.com/entry/20110620/1308560702)
2
2
 
3
- 次に文字列から数値への変換に[`std::from_chars`](https://cpprefjp.github.io/reference/charconv/from_chars.html)を使います。iostream系の`operator >>`や`std::stoi`, `std::atoi`, `std::scanf`などの数値変換できそうなものはすべて`std::strtol`系関数を呼び出すことになっています。ところがこれはlocaleに依存するため高速とはいえません。C++17で追加された`std::from_chars`はlocaleに依存しないため高速に変換できます。しかも文字列の分割と同時並行で変換ができるので中間バッファのvectorなどを確保せずにすみます。
3
+ 次に文字列から数値への変換に[`std::from_chars`](https://cpprefjp.github.io/reference/charconv/from_chars.html)を使います。iostream系の`operator >>`や`std::stoi`, `std::atoi`, `std::scanf`などの数値変換できそうなものはすべて`std::strtol`系関数を呼び出すことになっています。ところがこれはlocaleに依存するため高速とはいえません。C++17で追加された`std::from_chars`はlocaleに依存しないため高速に変換できます。しかも文字列の分割と同時並行で変換ができるので中間バッファのvectorなどを確保せずにすみます。
4
+
5
+ ---
6
+
7
+
8
+ というわけでそういうコードを書いてみました。
9
+
10
+ コードが長いのでリンク先で読んでください。
11
+ [https://wandbox.org/permlink/aBCCPI05GUPgenfn](https://wandbox.org/permlink/aBCCPI05GUPgenfn)