1

各コンテナに別の数値を掛けていたので、次のようにしました。

local_it begin = magnitudesBegin;
std::advance(begin , 2);
local_it end  = magnitudesBegin;
std::advance(end, 14);
std::transform(begin, end, firstHalf.begin(),
  std::bind1st(std::multiplies<double>(),100));

それは不思議に働きました、問題は別のコンテナの間で分割するために同じことをするときです。これが私の問題の実例です:

const std::size_t stabilitySize = 13;
boost::array<double,stabilitySize> secondHalf;
double fundamental = 707;
boost::array<double, stabilitySize> indexes = {{3,4,5,6,7,8,9,10,11,12,13,14,15}};
std::transform(indexes.begin(), indexes.end(), secondHalf.begin(),
  std::bind1st(std::divides<double>(),fundamental));

コンテナを分割します。ただし、配列内の各要素を707に対して分割する代わりに、配列内の各要素間で707を分割します。

4

3 に答える 3

4
std::bind1st(std::divides<double>(),fundamental)

上記のコードは、std::divides<double>2つの引数を取り、最初の引数の値をに固定するファンクターを取りますfundamental。つまり、操作の分子を修正し、期待どおりの結果を得ることができます。fundamental分母になるようにバインドする場合は、を使用しますstd::bind2nd

于 2013-03-26T15:58:52.390 に答える
2

次のことを試すことができます。除算は乗算とはまったく異なる演算で、定数をすべての要素で除算するだけです。

 std::bind1st(std::multiplies<double>(),1.0/707.0));
于 2013-03-26T15:53:22.770 に答える
0

数値707.0が基本定数のようなもので、除算が「変換」と見なされる場合は、「xからy」と呼びましょう(数値が何を表しているのかわからないので、これを意味のある単語に置き換えてください)。この「xからy」への変換を、再利用のために独立した関数でラップすると便利です。次に、でこの関数を使用しますstd::transform

double x_to_y(double x) {
    return x / 707.0;
}
...
std::transform(..., x_to_y);

C ++ 11を使用できる場合、または別のラムダライブラリを使用する場合、別のオプションは、使用されている場所にこのインラインで書き込むことです。bind2ndこの構文は、 :を使用したパラメータバインディングのように読みやすくなる場合があります。

std::transform(..., _1 / 707.0);  // when using boost::lambda
于 2013-03-26T16:02:08.153 に答える