0
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
  string str;
  cin>>str;
  str.erase(remove_if(str.begin(), str.end(), isspace),str.end());
  cout<<str;
  return 0;
}

エラー メッセージ:

/home/satish/Desktop/CPP/Remove_Spaces/main.cpp|9|エラー: 「remove_if(std::basic_string::iterator, std::basic_string::iterator, )」の呼び出しに一致する関数がありません|

4

5 に答える 5

4

まず、std::isspaceで宣言されて<cctype>いるので、それを含めます。

次に、関数を明示的な型にキャストしてオーバーロードを明確にする必要があります。

str.erase(
    remove_if(str.begin(), str.end(), static_cast<int(*)(int)>(isspace)),
    str.end());

第三に、James が指摘したように、これは ASCII の範囲外のすべての文字に対して未定義の動作を引き起こします。一般にこれを除外することはできないため、正の文字コードのみが に渡されるように努力する必要がありますstd::isspace

bool char_isspace(char c) {
    return std::isspace(static_cast<unsigned char>(c));
}

…

str.erase(
    remove_if(str.begin(), str.end(), char_isspace),
    str.end());
于 2013-09-03T10:19:06.517 に答える
3

コメントに示されているように、 のインクルードstd::isspace、つまりがありません<cctype>。しかし、それでも isspace がオーバーロードされているため、成功しませんこちら を参照してください

オーバーロードの問題の解決策は、関数ポインタを目的の関数シグネチャに明示的にキャストすることです。

str.erase(remove_if(str.begin(), str.end(), static_cast<int(*)(int)>(&std::isspace)),str.end());

ただし、コメントで指摘されているように、ここで使用される は、 ASCII 以外の文字を取得した場合isspaceの動作が未定義です。その場合、ロケールを 2 番目のパラメーターとして取るテンプレート化されたバージョンを使用することをお勧めします。

C++14:

str.erase(
  remove_if(str.begin(), str.end(), 
    [](auto c){ return isspace(c, cin.getloc());}
  ),
str.end());

C++11:上記のように、ラムダがchar cパラメーターとして使用されます (C++11 にはポリモーフィック ラムダはありません)。

C++03 with boost:boost::bindの述語の作成に使用remove_if

str.erase(
  remove_if(str.begin(), str.end(), 
    boost::bind(&std::isspace<char>, _1, boost::ref(cin.getloc()))
  ),
str.end());

ブーストなしの C++03:手書きのファンクターを述語として定義する

struct IsSpace {
  bool operator()(char c) {
    return std::isspace(c, cin.getloc());
  }
};

str.erase(
  remove_if(str.begin(), str.end(), 
    IsSpace()
  ),
str.end());
于 2013-09-03T10:19:54.987 に答える
0
#include <iostream>

int main() {
    std::string original =  "   type    ddd     ";
    std::string result;
    for(char c: original) {
        if( ! std::isspace(c)) result += c;
    }
    original.swap(result);
    std::cout << "Modified: " << original << std::endl;
    return 0;
}

結果のサイズを予測できる場合 (または元のサイズを取得するだけで十分な場合)、result.reserve() を使用するとパフォーマンスが向上します。

于 2013-09-03T11:24:50.837 に答える