gpt4 book ai didi

c++ - 使用 std::transform 和 tr1::bind 转换 std::complex 的 vector

转载 作者:太空狗 更新时间:2023-10-29 20:47:25 26 4
gpt4 key购买 nike

给定 std::complex 的 std::vector,我想将其转换为仅包含复数的实部除以某个常数系数的 vector 。现在,我这样做:

std::vector<std::complex<double> > vec;
std::vector<double> realVec;
double norm = 2.0;
...
for (std::vector<std::complex<double> >::iterator it = vec.begin(), itEnd = vec.end(); it != itEnd; ++it)
realVec.push_back((*it).real() / norm);

这当然很好用,但我正在寻找一种方法来使用 std::transform 来做同样的事情。我试过:

transform(vec.begin(), vec.end(), back_inserter(realVec), tr1::bind(divides<double>(), tr1::bind(&complex<double>::real, tr1::placeholders::_1), norm));

但它不会起作用。我有这个错误:

erreur: no matching function for call to ‘bind(<unresolved overloaded function type>, std::tr1::_Placeholder<1>&)’|

我不明白为什么会有“未解析的重载函数类型”。

谁能给我解释一下哪里出了问题?

最佳答案

不幸的是,您不能这样做,至少不能直接这样做。标准库成员函数的类型(如 complex<double>::real)未指定,因此实现可能会提供额外的重载,并且那里的函数可能有额外的参数和默认参数。

实际上,没有可移植的方法来获取标准库成员函数的地址。

最好的办法是编写辅助函数:

template <typename T>
T get_real(const std::complex<T>& c) { return c.real(); }

并绑定(bind)到:

std::tr1::bind(&get_real<double>, std::tr1::placeholders::_1)

关于c++ - 使用 std::transform 和 tr1::bind 转换 std::complex 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5717679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com