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>,并将第一个参数的值固定为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 to y”(我不知道您的数字代表什么,所以用有意义的词替换它)。最好将这种“x 到 y”转换包装在一个独立的函数中以实现可重用性。然后,在 上使用此功能std::transform

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

如果你有可用的 C++11,或者想使用另一个 lambda 库,另一个选择是在使用的地方内联编写这个。您可能会发现此语法更具可读性,例如使用以下参数绑定bind2nd

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