在C ++复杂向量的每个元素上调用conj()函数

时间:2016-02-18 11:03:36

标签: c++ c++11 vector

如果我执行此代码:

function openerp_pos_models(instance, module){ //module is instance.point_of_sale
var QWeb = instance.web.qweb;
var _t = instance.web._t;

var round_di = instance.web.round_decimals;
var round_pr = instance.web.round_precision   

module.PosModel = module.PosModel.extend({
       "Here is the same is in the original file, except for the following line"
{
        model:  'res.partner',
        fields: ['name','street','city','state_id','country_id','vat','phone','zip','mobile','email','ean13','write_date','MY_NEW_FIELD'],
        domain: [['customer','=',true]],
        loaded: function(self,partners){
            self.partners = partners;
            self.db.add_partners(partners);
        },
    },

然后编译器给出了以下错误:

vector<complex<double> >
idft( vector<complex<double> > * v)
{

    for_each(v->begin(), v->end(), conj);

如果我只为一个元素应用conj(),那么它可以正常工作:

dft.cpp: In function 'std::vector<std::complex<double>, std::allocator<std::complex<double> > > idft(std::vector<std::complex<double>, std::allocator<std::complex<double> > >*)':
dft.cpp:38: error: no matching function for call to 'for_each(__gnu_cxx::__normal_iterator<std::complex<double>*, std::vector<std::complex<double>, std::allocator<std::complex<double> > > >, __gnu_cxx::__normal_iterator<std::complex<double>*, std::vector<std::complex<double>, std::allocator<std::complex<double> > > >, <unresolved overloaded function type>)'

如何在不使用循环的情况下对整个向量应用conj()?

4 个答案:

答案 0 :(得分:4)

for_each在现代(C ++ 11及更高版本)C ++中很少是一个好主意。

void idft( std::vector<std::complex<double> >& v)
{
  for (auto& x : v)
    x = std::conj(x);
}

甚至:

template<class Range>
void idft( Range& v)
{
  for (auto& x : v)
    x = std::conj(x);
}

干净,通用,正确且易于阅读。

答案 1 :(得分:4)

for_each选择的答案(现在已更改) 绝对 错误。您无法使用for_each,因为它不会修改您正在迭代的对象。以下是使用std::transform和简单lambda函数的方法。

std::transform(v->begin(),v->end(), v->begin(), [](const std::complex<double>& c) -> std::complex<double> { return std::conj(c); });

答案 2 :(得分:0)

因为std::conj有多个模板函数重载,编译器不知道应该根据函数名选择哪一个。

template< class T >
complex<T> conj( const complex<T>& z );       (1)     
template< class DoubleOrIngeter >
std::complex<double> conj( DoubleOrInteger z );       (3)     (since C++11)

你可以

typedef complex<double> (*CONJ_TYPE)( const complex<double>& z );
for_each(v->begin(), v->end(), static_cast<CONJ_TYPE>(conj<double>));

LIVE

答案 3 :(得分:0)

如果你的函数(conj)没有修改它的输入arg,则使用std :: transform。