15

Python zip ( http://docs.python.org/2/library/functions.html )に似たものを書きたいと思います。zip は、さまざまなタイプの可変数のベクトルを取り込む必要があり、最短の入力の長さに切り捨てられたタプルのベクトルを返します。

例えば

x = [1, 2, 3]
v = ['a', 'b']

出力をベクトルにしたい [ <1, 'a'>, <2, 'b'>]

C++11 でこれを行うにはどうすればよいですか?

4

3 に答える 3

2

これはあなたが望むことをするはずです。だけではなく、任意の範囲で機能しますvector

template <typename Iterator0, typename Iterator1>
std::vector<std::tuple<
    typename Iterator0::value_type,
    typename Iterator1::value_type>>
zip(
    Iterator0 begin0, Iterator0 end0,
    Iterator1 begin1, Iterator1 end1)
{
    std::vector<std::tuple<
        typename Iterator0::value_type,
        typename Iterator1::value_type>> result;
    while (begin0 != end0 && begin1 != end1)
    {
        result.emplace_back(*begin0, *begin1);
        ++begin0;
        ++begin1;
    }
    return result;
}

このように呼びます。

std::vector<int> x;
std::vector<double> y;
auto xy = zip(x.begin(), x.end(), y.begin(), y.end());

ここで試すことができます。

zip可変個引数テンプレートを使用するように変更して、任意の数の範囲を一緒に圧縮できるようにすることはおそらく可能です。

<algorithm>ヘッダーをさらに一致させるには、戻りvoid、代わりに出力が書き込まれる出力反復子を取得します。

于 2013-06-17T21:54:18.417 に答える