3
    typedef std::vector<std::string> TVector;
    TVector a_list;

    populate vector...
    for_each(a_list.begin(),a_list.end(),std::toupper);

エラー

no matching function for call to 'for_each(std::vector<std::basic_string<char> >::iterator, std::vector<std::basic_string<char> >::iterator, <unresolved overloaded function type>)

標準の for ループを使用して要素を反復処理する必要がありますか? または、c++ 11 機能の使用を許可されていない別の方法がありますか。

ありがとう

4

3 に答える 3

4

このtoupper関数は、文字列ではなく文字に使用されます。また、大文字を返すため、 では機能しませんがfor_each、 では機能しstd::transformます。2 つのオーバーロードに存在する問題もありstd::toupper、コンパイラはどちらを使用するかを決定できません。<cctype>プレーンtoupper(またはオプションで ) を含めて使用::toupperし、適切な機能を取得します。

最初にベクター内のすべての文字列を反復処理し、文字列をもう一度反復処理して呼び出す必要がありますtoupper

手動で行うか、ファンクターオブジェクトを使用transformして使用することができます。

struct strtoupper
{
    std::string operator()(const std::string& str) const
    {
        std::string upper;
        std::transform(str.begin(), str.end(), std::back_inserter(upper), ::toupper);
        return upper;
    }
};

// ...

std::transform(a_list.begin(), a_list.end(), a_list.begin(), strtoupper());
于 2013-05-29T09:32:19.430 に答える
3

のベクトルがstd::stringありstd::touppercharas パラメータが必要です。したがって、使用できません。あなたができることは次のとおりです。

std::for_each(list.begin(), list.end(),[](std::string& s) { std::for_each(s.begin(), s.end(), std::toupper);});

于 2013-05-29T09:32:33.077 に答える
2

std::toupperオーバーロードされた関数です。そのため<unresolved overloaded function type>、エラー メッセージが表示されます。特定のオーバーロードを選択するには、それをキャストする必要があります。

static_cast<int(*)(int)>(std::toupper)

for_eachまた、このタスクには適切な選択ではありませんtoupper。リスト内の各文字列を呼び出し、結果を破棄します。std::transformが適切な選択です。出力イテレータに出力を書き込みます。ただし、toupper文字列ではなく文字で機能します。文字列内の各文字transformを呼び出すために引き続き使用できます。toupper

std::transform(
    a_string.begin(),
    a_string.end(),
    a_string.begin(),
    static_cast<int(*)(int)>(std::toupper)
);

この単純なケースでは、ループを使用する方がおそらく明確です。

for (TVector::iterator i = a_list.begin(), end = a_list.end(); i != end; ++i) {
    for (std::string::size_type j = 0; j < i->size(); ++j) {
        (*i)[j] = toupper((*i)[j]);
    }
}

<algorithm>しかし、ツールだけで書きたい場合は<iterator>、ファンクターを作成できます。

struct string_to_upper {
    std::string operator()(const std::string& input) const {
        std::string output;
        std::transform(
            input.begin(),
            input.end(),
            std::back_inserter(output),
            static_cast<int(*)(int)>(std::toupper)
        );
        return output;
    }
};

// ...

std::transform(
    a_list.begin(),
    a_list.end(),
    a_list.begin(),
    string_to_upper()
);
于 2013-05-29T09:34:39.090 に答える