48

こんにちは私はたとえばスカラー値でベクトルを(乗算、加算など)したいのですmyv1 * 3が、forloopで関数を実行できることは知っていますが、STL関数を使用してこれを実行する方法はありますか?{Algorithm.h ::変換関数}のようなものですか?

4

6 に答える 6

94

はい、使用していstd::transformます:

std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind(std::multiplies<T>(), std::placeholders::_1, 3));

std::bind1st()C ++ 17より前は、C++11で非推奨となったを使用できました。

std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind1st(std::multiplies<T>(), 3));

プレースホルダーの場合。

#include <functional> 
于 2010-10-07T19:22:45.970 に答える
27

valarrayの代わりに使用できる場合はvector、スカラー乗法を実行するための演算子が組み込まれています。

v *= 3;

を使用する必要がある場合はvector、実際に使用transformして作業を行うことができます。

transform(v.begin(), v.end(), v.begin(), _1 * 3);

Boost.Lambdaに似たものがあり、:-Pのような無名関数オブジェクトを簡単に作成できると仮定します_1 * 3

于 2010-10-07T19:22:18.210 に答える
23

あなたの質問のためのMordernC++ソリューション。

std::vector<double> myarray;
double myconstant{3.3};
std::transform(myarray.begin(), myarray.end(), myarray.begin(), [&myconstant](auto& c){return c*myconstant;});
于 2019-01-20T18:54:05.857 に答える
1

for_eachベクトルをトラバースし、あるパターンに従って各要素を操作したい場合は、非常に適切だと思います。この場合、単純なラムダで十分です。

std::for_each(myv1.begin(), mtv1.end(), [](int &el){el *= 3; });

ラムダ関数で使用するためにキャプチャする変数(たとえば、事前に定義されたスカラーで乗算したい場合)は、参照として括弧に入れられることに注意してください。

于 2018-01-03T10:43:58.810 に答える
0

結果を新しいベクトルに格納する必要がある場合は、ヘッダーのstd::transform()fromを使用できます。<algorithm>

#include <algorithm>
#include <vector>

int main() {
    const double scale = 2;
    std::vector<double> vec_input{1, 2, 3};
    std::vector<double> vec_output(3); // a vector of 3 elements, Initialized to zero
    // ~~~
    std::transform(vec_input.begin(), vec_input.end(), vec_output.begin(),
                   [&scale](double element) { return element *= scale; });
    // ~~~
    return 0;
}

つまり、ここで言っているのは、

  • 最初()から最後( )までの値(elements)を取り、 vec_inputvec_input.begin()vec_input.begin()
    • [beginning, end)基本的に、最初の2つの引数を使用して、変換する要素の範囲()を指定します。
  • それぞれelementを最後の引数であるラムダ式に渡します。
  • ラムダ式の出力を取得し、vec_output最初から開始します(vec_output.begin())。
    • 3番目の引数は、宛先ベクトルの先頭を指定することです。

ラムダ式

  • [&scale]参照により外部からスケールファクター()の値をキャプチャし、
  • double型のベクトル要素を入力として受け取ります(によって渡されますstd::transform()
  • 関数の本体では、最終結果を返します。
    • 上で述べたように、これは結果的にに保存されますvec_input

最後の注意:不要ですが、以下のようにラムダ式を渡すことができます:

[&scale](double element) -> double { return element *= scale; }

ラムダ式の出力がdoubleであることを明示的に示しています。ただし、この場合、コンパイラはそれ自体で戻り型を推測できるため、これは省略できます。

于 2021-11-16T22:18:00.060 に答える
-1

これはSTLではありませんが、さまざまなニーズが発生したときに適応できるものです。

以下は、計算に使用できるテンプレートです。'func'は、実行したい関数です。乗算、加算などです。「parm」は「func」の2番目のパラメーターです。これを簡単に拡張して、さまざまなタイプのより多くのパラメーターを持つさまざまな関数を取得できます。

template<typename _ITStart, typename _ITEnd, typename _Func , typename _Value >
_ITStart xform(_ITStart its, _ITEnd ite, _Func func, _Value parm)
{
    while (its != ite) { *its = func(*its, parm); its++; }
    return its;
}
...

int mul(int a, int b) { return a*b; }

vector< int > v;

xform(v.begin(), v.end(), mul, 3); /* will multiply each element of v by 3 */

また、これは「安全な」関数ではありません。使用する前に、型/値のチェックなどを行う必要があります。

于 2010-10-07T20:54:06.703 に答える