3

TL;DR

どのようにして同じ結果を得ることができますか

std::copy(std::begin(a), std::end(a), std::begin(b));

range-v3、そしておそらくその素晴らしい構文を使用していますか?

編集

私が問題を抱えていた理由は、 を正しく使用する方法を誤解していたことranges::copyです。2 番目の引数は、範囲オブジェクトではなくiteratorでなければなりません。私のせいです;)

それにもかかわらず、次のように、範囲指定された割り当てを実行するために、ある種の構文糖衣が利用できるかどうかをまだ尋ねています。

ranges::???(b) = a | op1 | op2 | ... ; 

問題

2 つの固定サイズのベクトルがあります (実行時)。最初のベクトルでデータの複雑な変換を実行し、結果を 2 番目のベクトルに格納する必要があります。最初のベクトルを保持する必要があり、新しい一時ベクトルを作成したくありません。

共通コード

using namespace std;
vector<double> a;
...
vector<double> b(a.size());

標準で

transform(begin(a), end(a), begin(b), complexFun);

ハイブリッド std-rangev3

auto transformation = a | ranges::view::transform(complexFun);
copy(begin(transformation), end(transformation), begin(b));

この単純なケースでは、そうする必要はほとんどありません。ただし、複数の操作が関係する場合は、範囲ビューを作成してから使用するstd::copyと特に便利です。

書きたいこと

ranges::???(b) = a | ranges::view::transform(complexFun);

私が期待しているのは、この機能が既に存在していて、見つけることができないということです。

4

2 に答える 2

4

これを行うには、いくつかの良い方法があります。まず、目的地がまだなく、vectorそれを作成したい場合:

auto b = a | ranges::view::transform(complexFun) | ranges::to_vector;

次に、vector容量を再利用したい宛先がすでにある場合:

b.clear(); // Assuming b already contains junk
b |= ranges::action::push_back(a | ranges::view::transform(complexFun));

ranges::size(a | ranges::view::transform(complexFun))どちらの場合も、range-v3 は、再割り当てによるコピーを回避するために、要素の宛先ベクトルに容量を予約するのに十分スマートです。

于 2017-12-15T14:55:16.430 に答える