65

std::string から「改行」を削除する最も効率的な方法は何ですか?

4

12 に答える 12

135
#include <algorithm>
#include <string>

std::string str;

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());

の動作は、std::remove期待したものとはまったく異なる場合があります。その説明はこちらをご覧ください。

于 2009-09-28T19:09:42.313 に答える
11

改行が文字列の最後にあると予想される場合、次のようになります。

if (!s.empty() && s[s.length()-1] == '\n') {
    s.erase(s.length()-1);
}

文字列のどこにでも多くの改行を含めることができる場合:

std::string::size_type i = 0;
while (i < s.length()) {
    i = s.find('\n', i);
    if (i == std::string:npos) {
        break;
    }
    s.erase(i);
}
于 2009-09-28T19:06:24.203 に答える
7

を探して、 erase-remove イディオムを使用する必要があります'\n'。これは、標準的なシーケンス コンテナーで機能します。だけではありませんstring

于 2009-09-28T19:06:37.150 に答える
5

DOSまたはUnixの改行用のものは次のとおりです。

    void chomp( string &s)
    {
            int pos;
            if((pos=s.find('\n')) != string::npos)
                    s.erase(pos);
    }
于 2012-11-09T17:36:27.887 に答える
1

std::アルゴリズムを使用します。この質問には、適切に再利用可能な提案がいくつかあります C++ の std::string からスペースを削除します

于 2009-09-28T19:08:26.653 に答える
1
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
于 2009-09-28T19:08:31.850 に答える
1

このコードは、文字列からすべての改行を削除しますstr

O(N) の実装は、SO に関するコメントなしで、本番環境でのコメントが最も適しています。

unsigned shift=0;
for (unsigned i=0; i<length(str); ++i){
    if (str[i] == '\n') {
        ++shift;
    }else{
        str[i-shift] = str[i];
    }
}
str.resize(str.length() - shift);
于 2009-09-28T19:09:26.490 に答える
1
 std::string some_str = SOME_VAL;
 if ( some_str.size() > 0 && some_str[some_str.length()-1] == '\n' ) 
  some_str.resize( some_str.length()-1 );

または(最後にいくつかの改行を削除します)

some_str.resize( some_str.find_last_not_of(L"\n")+1 );
于 2009-09-28T19:10:01.067 に答える
0

文字列のどこかにある場合は、O(n) よりもうまくできません。

唯一の方法は、文字列内で「\n」を検索して消去することです。

for(int i=0;i<s.length();i++) if(s[i]=='\n') s.erase(s.begin()+i);

より多くの改行の場合:

int n=0;
for(int i=0;i<s.length();i++){
    if(s[i]=='\n'){
        n++;//we increase the number of newlines we have found so far
    }else{
        s[i-n]=s[i];
    }
}
s.resize(s.length()-n);//to delete only once the last n elements witch are now newlines

すべての改行を一度消去します。

于 2009-09-28T19:06:05.207 に答える
0

回答 3 について、最後の \n オフ文字列コードのみを削除する:

if (!s.empty() && s[s.length()-1] == '\n') {
    s.erase(s.length()-1);
}

文字列が本当に空の場合、if 条件は失敗しませんか?

する方が良いではないですか :

if (!s.empty())
{
    if (s[s.length()-1] == '\n')
        s.erase(s.length()-1);
}
于 2016-06-06T09:28:09.467 に答える
-1

これらの答えはすべて、私には少し重いようです。

「\n」を完全に削除して、他のすべてを元の場所に戻すと、一部の文字が奇妙に見える方法で一緒に叩きつけられる可能性があります。それでは、なぜ単純な (そして最も効率的な) ことをしないのでしょうか? すべての '\n' をスペースに置き換えますか?

for (int i = 0; i < str.length();i++) {
   if (str[i] == '\n') {
      str[i] = ' ';
   }
}

エッジでこれの速度を改善する方法があるかもしれませんが、文字列のチャンク全体をメモリ内で移動するよりもはるかに高速です。

于 2009-09-28T19:15:24.370 に答える