4

入力としてファイルを取得し、次のように最初の行を読み取ります (引用符は開始と終了を示しますが、ファイルにはありません)。

"      1,     2.0,     3.0,     4.0                         "

次のような削除コマンドを使用すると:

    astring = line;
    cout << endl << "Before trim: " << line << endl;
    remove(astring.begin(), astring.end(), ' ');
    cout << endl << "After trim: " << astring << endl;

私は次のように出力を得ました:

1,2.0,3.0,4.02.0,    3.0,     4.0

出力1,2.0,3.0,4.0のみが必要です。ここで何が問題なのですか?

4

2 に答える 2

7

std::remove削除されていないすべての要素をシーケンス内で前方に移動するだけです。次に、以下を使用して、基になるコンテナーを切り詰める必要がありますerase

s.erase(std::remove(s.begin(), s.end(), ' '), s.end());

これは、消去削除イディオムと呼ばれます。 removeコンテナーへの参照がないため、基になるコンテナー自体を切り捨てることはできません。コンテナ内の要素への反復子のみがあります。

于 2011-07-11T04:32:46.863 に答える
0

James の答えは正しかったので、多くの作業を省くことができました。td::remove は、削除されていないすべての要素をシーケンス内で前方に移動するだけです。次に、erase を使用して、基になるコンテナーを切り詰める必要があります。

std.erase(std::remove(s.begin(), s.end(), ' '), s.end()); これは消去削除イディオムと呼ばれます。remove は、コンテナーへの参照がないため、基になるコンテナー自体を切り捨てることはできません。コンテナ内の要素への反復子のみがあります。

于 2012-12-25T07:29:14.273 に答える