2

基本的に、私はこれをやろうとしています:

word.resize(remove_if(word.begin(), word.end(), not1(isalpha())) - word.begin());

独自の関数を宣言して渡すだけの醜い回避策について知っています。しかし、これを機能させる方法はありますか?isalpha 関数の下に赤い線で「関数呼び出しの引数が少なすぎます」というメッセージが表示されます。

4

1 に答える 1

6

C++03 では、通常、次のようなものを使用します。

std::not1(std::ptr_fun(isalpha))

C++11 では、より頻繁にラムダを使用します。

word.resize(
   remove_if(word.begin(), word.end(), 
             [](char ch){return !isalpha(ch);}) -word.begin());

編集:昨日コードレビューで尋ねられた同様の質問も読みたいと思うかもしれません. 完全に同一というわけではありませんが、興味深いほど十分に似ています ( について!isalphaではなく、文字列からアルファベット以外の文字を削除することについて質問しています)。

Edit2:簡単なテストを行うと、これはうまくいくようです:

#include <algorithm>
#include <string>
#include <iostream>
#include <iterator>
#include <ctype.h>

template <class T>
T gen_random(size_t len) {
    T x;
    x.reserve(len);

    std::generate_n(std::back_inserter(x), len, rand);
    return x;
}

template <class Container>
void test2(Container &input) {
    input.resize(
        std::remove_if(input.begin(), input.end(), 
        [](char ch){return !isalpha(ch);}) -input.begin());
}

int main(){

    std::string input(gen_random<std::string>(100));
    std::cout << "Input: \n" << input << "\n\n";

    input.resize(
        std::remove_if(input.begin(), input.end(), 
        [](char ch){return !isalpha(ch);}) -input.begin());

    std::cout << "Result: " << input << "\n";

    return 0;
}

少なくともこれを実行すると、次のようになります。

Input:
ë♠╖G▐│↕M╚C╗ïª▼♥Z}       8%▼]╘╦ⁿû⌡E;‼
∟█«2 ÜPε@x6²↕I2÷₧}I▄¡O¶≥D@f╨k─0╖2;í"÷"æ¥

Result: lRIGMCZEPxIIODfk

一見すると、私が生成したランダムな入力には少なくとも 1 つのキャリッジ リターンが含まれていたため、入力の最初の数文字が出力に表示されません。「G」から始まるカップル、最後にカップルをチェックしましたが、すべて問題ないようでした。

于 2012-04-27T19:13:38.820 に答える