2

私はC++が初めてです。データをファイルに出力できません。イテレータを使用してマップを出力しています。print メソッドは、キー値である i を受け取り、それに対応するベクトルを出力します。これで、cout<< を使用して通常どおり出力すると問題なく動作しますが、同じ出力をファイルに入れようとすると、プログラムがクラッシュします。outfile<< 行でクラッシュしているのは *it であることはわかっています。これをランダムな文字列に置き換えると、ファイルに正常に出力されるためです。また、そのメソッドをプログラムのメイン関数に直接転送して同じエラーを取得できるため、print メソッドのパラメーターが問題を引き起こしていないこともわかっています。これを修正する方法について何か助けていただければ幸いです。ありがとうございます! エラーが発生している印刷方法は次のとおりです。

    public: void print(int i, vector<string> in, ostream& outfile) // print method for printing a vector and it's key
{

    sort(in.begin(), in.end()); // sort the vector alphabetically first

    vector<string>::iterator it; 

    it= unique(in.begin(), in.end()); // makes sure there are no duplicate strings

    in.resize( distance(in.begin(),it) );

    for( it = in.begin(); it != in.end(); it++ ) // iterate through it

    cout << i << ": "<< *it<<endl; // and print out the key value and each string in the vector
   // outfile<< i << ":" << *it<< endl; // prints to file
}
4

2 に答える 2

2

@slugonamission はすでに正しい答えを提供しているので、関数を実際に単純化し、エラーを起こしにくくすることができることを指摘しておきます。コードのフォーマットが必要なため、これを回答として書いています。それ以外の場合は、コメントに投稿します。

void print(int i, vector<string> v, ostream& o)
{
    sort(begin(v), end(v));
    v.erase(unique(begin(v), end(v))); // Do this in one step, no iterator mess
    for (auto const& s : v) // Avoid manual iteration cycles if you can
    {
        o << i << ":" << s << endl;
        ...
    }
}

編集:

@juanchopanza が正しく指摘しているように、同じことを実現するさらに迅速な方法は、ベクターのコンテンツを連想コンテナーに転送して一意性を確保することです。これにより、次の方法でベクトルを渡すことができますconst &

void print(int i, vector<string> const& v, ostream& o)
{
    unordered_set<string> c(begin(v), end(v));
    for (auto const& s : c)
    {
        o << i << ":" << s << endl;
    }
}
于 2013-01-27T23:40:56.750 に答える
2

cout同時に回線を使用していませんか?もしそうなら、私はそれが何であるかを知っていると思います。

中かっこのforないループは、ループ本体として次のステートメントを実行します。cout行と行の両方を使用すると、outfileすべてが出力され、ループの後it、配列の末尾のすぐ後ろに配置されます。次に、これを逆参照してファイルに書き込もうとしますが、無効なイテレータを逆参照しているため、もちろん失敗します。

簡単な答えは、 for ループ内のステートメントを中括弧で囲みます。

たとえば、次のようになります (適切にインデントされている場合)。

for( it = in.begin(); it != in.end(); it++ ) // iterate through it
    cout << i << ": "<< *it<<endl; 
outfile<< i << ":" << *it<< endl; // prints to file

その最後の行で、it = in.end()はベクトルの終わりのすぐin.end()後ろの要素です。次に、存在しない(そして無効な)その場所にある要素にアクセスしようとすると、失敗します。代わりに、それをループ内に移動する必要があります。

for( it = in.begin(); it != in.end(); it++ ) // iterate through it
{
    cout << i << ": "<< *it<<endl; // and print out the key value and each string in the vector
    outfile<< i << ":" << *it<< endl; // prints to file
}
于 2013-01-27T23:09:31.523 に答える