0

vector<int> a整数の 2 つのベクトル (および)に格納された整数の値を (ペアごとに) 追加する、実行時間効率の高いガジェットを探していvector<int> bます。これはメモリ効率も同様です。ベクトルのサイズは、異なるか等しいと見なされます。


私が持っているのはこれです:

    vector<int> c;
    if( a.size() > b.size() )
    {
       for( size_t i = 0 ; i < b.size() ; ++i )
       {
          c.push_back(a[i]+b[i]);
       }
    else if ( a.size() < b.size() )
    {
       for( size_t i = 0 ; i < a.size() ; ++i )
       {
          c.push_back(a[i]+b[i]);
       }
    }
    else
    {
       for( size_t i = 0 ; i < a.size() ; ++i )
       {
          c.push_back(a[i]+b[i]);
       }
    }

例:

vector<int> a-> (0)(12)(0)(0)(123)(12)

vector<int> b-> (305)(10)(3)(4)(8201)(230)(0)(0)(0)

vector<int> c-> (305)(22)(3)(4)(8324)(242)(0)(0)(0)

4

2 に答える 2

3

使用できますstd::transform

#include <algorithm>  // for transform and min
#include <functional> // for std::plus
#include <iterator>   // for std::begin, but it's
                      // implicitly included by <vector>
std::vector<int> a;
std::vector<int> b;
auto size = std::min(a.size(), b.size()); 
std::vector<int> c(size); // creates the third vector big enough for results

std::transform(
    begin(a), begin(a)+size, begin(b),
    begin(c), std::plus<int>()
);

その下std::transformにあるのは、各範囲 (最初の 3 つのパラメーターで定義) から 1 つの要素を取得し、それらにバイナリ関数を適用し (最後のパラメーターstd::plus<int>)、結果を 3 番目の範囲 (4 番目のパラメーター) に格納する単なるループです。

すべての要素を反復するよりも、「実行時の効率」に関しては向上しません。あなたのソリューションはほぼ最適です。しかし、標準アルゴリズムには、意図が明確であり、コンパイラーがそれらを効率的に最適化する方法をおそらく知っているという追加の利点があります。

于 2013-08-01T20:12:17.617 に答える