2011-06-20 8 views
15

大きなベクトルがあります。ベクトル値をファイルに書き込む方法

私が使用する方法は、プログラムの実行時間を大きく掛けます。最初は、stringstreamsを使用して計算された文字列にすべての値を書き込み、後でその文字列をファイルに書き込みます。他の方法は、事実の後で長い文字列を作成し、それをファイルに書き込むことです。しかし、どちらも非常に遅いです。

テキストファイルにベクトルの値を改行してただちに書き込む方法はありますか?

+2

「ただのテキストファイルへのベクトルの値を書き込むための方法があります:ここでstd::string SはC++ 98の構文を使用して例がある(質問は事前にC++ 11を頼まれました)直ちに改行なしで? - 改行の有無にかかわらず必要ですか? – Ajay

+1

私のプログラムは、これまで5分で3時間かかっていたことを終わらせることができてうれしく思います。XD – TimeCoder

答えて

33

std::ofstreamを使用すると、std::ostream_iteratorstd::copy()がこれを行う通常の方法です。

#include <fstream> 
#include <iterator> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::vector<std::string> example; 
    example.push_back("this"); 
    example.push_back("is"); 
    example.push_back("a"); 
    example.push_back("test"); 

    std::ofstream output_file("./example.txt"); 
    std::ostream_iterator<std::string> output_iterator(output_file, "\n"); 
    std::copy(example.begin(), example.end(), output_iterator); 
} 
+2

例として文字列を使用するように注意してください。文字列のベクトルをロードするための逆は異なります(出力/入力が異なる唯一の標準タイプです)。 –

+11

あなたは "質問には前のC++ 11が尋ねられました"と書いてあります - これを行うにはC++ 11とは別の方法がありますか? – Default

4

たぶん私は何かを逃したが、何が間違っているしている:私はあなたの実行時間を殺しているものであると仮定し、潜在的に二次の文字列の連結を、行うために必要がなくなり

std::ofstream f("somefile.txt"); 
for(vector<X>::const_iterator i = v.begin(); i != v.end(); ++i) { 
    f << *i << '\n'; 
} 

+0

申し訳ありませんが、vとXは何を表していますか? – TimeCoder

+0

'v'はあなたの含むベクトルです。 'X'はそれに含まれる型です。 – Johnsyweb

6
#include <fstream> 
#include <vector> 
#include <string> 

int main() 
{ 
    std::vector<std::string> v{ "one", "two", "three" }; 
    std::ofstream outFile("my_file.txt"); 
    // the important part 
    for (const auto &e : v) outFile << e << "\n"; 
} 
関連する問題