0

事前に行数を予約できるように、ファイルから文字列のベクトルに文字列を格納する簡単な方法を探しています。これを行う最善の方法は何ですか?最初に改行文字を続けるか、ファイルの合計サイズを取得して、サイズを 80 分の 1 に予約して、何を予約するかを概算する必要があります。理想的には、ベクトルを毎回再割り当てする必要がないようにしたいと考えています。これにより、大きなファイルの処理が大幅に遅くなります。理想的には、アイテムの数を事前に数えますが、新しい行を数えてバイナリモードで開き、再度開くことでこれを行う必要がありますか? それは無駄に思えますが、これについてのいくつかの考えに興味があります。また、以下の getline コードで emplace_back を使用して一時的な somestring を取り除く方法もあります。テキストの行数を見つける最速の方法 (C++)

std::vector<std::string> vs;
std::string somestring;
std::ifstream somefile("somefilename");
while (std::getline(somefile, somestring))
vs.push_back(somestring);

また、事前に合計サイズを取得するために何かを行うこともできますが、この場合は char* を直接ベクトルに変換できますか? これは、size / 80 またはいくつかの定数を言って予約の推定サイズを前もって与えるという予約のヒントに戻ります。

        #include <iostream>   
        #include <fstream>     

        int main () {
          char* contents;
          std::ifstream istr ("test.txt");

          if (istr) 
          {
            std::streambuf * pbuf = istr.rdbuf();

            //which I can use as a reserve hint say size / 80  
            std::streamsize size = pbuf->pubseekoff(0,istr.end);  

            //maybe I can construct the vector from the char buf directly?
            pbuf->pubseekoff(0,istr.beg);       
            contents = new char [size];
            pbuf->sgetn (contents,size);
          }
          return 0;
    }
4

2 に答える 2

1

事前に行数を数えて時間を無駄にするのではなくreserve()、初期値を取得してから実際の行をプッシュし始めます。予約された数のアイテムをプッシュする場合はreserve()、必要に応じて繰り返す前に、さらにスペースを空けてください。 .

于 2013-07-26T01:43:55.647 に答える