44

のようなものを書けるようになりたい

char f(char);
vector<char> bar;
vector<char> foo = map(f, bar);

関数はtransform似ているように見えますが、結果のコレクションのサイズは自動生成されません。

4

5 に答える 5

49

で使用できますstd::back_inserter<iterator>、前のサイズを指定する方が効率的です。例えば:

string str = "hello world!", result;
transform(str.begin(), str.end(), back_inserter(result), ::toupper);
// result == "HELLO WORLD!"
于 2010-08-27T00:05:08.703 に答える
24

この質問は、C++11 標準が発効する前に尋ねられました... 現在std::transform()、関数型プログラミングの「マップ」に相当する (醜い) ものがあります。使用方法は次のとおりです。

auto f(char) -> char; // or if you like: char f(char)
vector<char> bar;
vector<char> foo;
// ... initialize bar somehow ...
std::transform(bar.begin(), bar.end(), std::back_inserter(foo), f);
于 2015-04-26T19:43:56.483 に答える
4

これを機能させるには、次の観察が必要です。

  1. 割り当てを効率的にするために、map関数は作業を行わないようにする必要があります。代わりに、引数を一時オブジェクトに保存する必要があります(あなたの場合、それはのインスタンスになりますclass map::result<char(*)(char), vector<char> >
  2. このmap::result一時的なものにはtemplate <typename T> operator T変換が必要です。
  3. map::resultがに割り当てられている場合std::vector<char>、この変換が唯一の実行可能です。
  4. 変換演算子class map::result<char(*)(char), vector<char> >::operator vector<char>には、入力タイプと戻りタイプ、およびマッピング関数があります。この時点で、入力を効果的に変換できます。

<edit>

コード

template<typename CONT, typename FUNC>
class mapresult {
    CONT const& in;
    FUNC f;
public:
    template<typename RESULT> RESULT to() const
    {
        RESULT out;
        for (auto const& e : in) { out.push_back(f(e)); }
        return out;
    }
    template<typename RESULT> operator RESULT() const
    {
        return this->to<RESULT>();
    }
    mapresult(CONT const& in, FUNC f) : in(in), f(std::move(f)) { }
};

template<typename CONT, typename FUNC>
auto map(CONT const& in, FUNC f) -> mapresult<CONT, FUNC>
{
    return mapresult<CONT, FUNC>(in, f);
}

このように使用します:

using namespace std;
char foo(char c) { return c | ('A' ^ 'a'); }
std::string in = "Test";

int main(int argc, char* argv[])
{
    string out = map(in, &foo);
    cout << out << endl;

    char replace = 'e';
    cout << map(in, [replace](char c){return c == replace ? '?' : c; }).to<string>();
}
于 2010-08-27T09:04:18.767 に答える