0

为标题道歉,我正在努力想出一个。

我在这里问了一个问题,我正在尝试改进它。我有一个结构:

namespace Complex {

typedef struct complex_t { 
    double re; 
    double im;
    } complex;
}

我希望将 aarray或 a推回复数的vector一维向量,如下所示:

template<typename Iterator>
vector<Complex::complex> convertToComplex(Iterator begin, Iterator end)
{
     vector<Complex::complex> vals12(10);


     for(auto i=begin; (i != end); i++)
     {
      vals12[i].re = *i;
     }

     return vals12;
  } 

并得到以下错误:

no viable overloaded operator[] for type 'vector<Complex::complex>' vals12[i].re = *i;

现在请注意,如果我执行以下操作:

vals12[0].re = 10;

可以,但是,当使用数组时,它会抛出这个错误,我不明白为什么会这样。我唯一的想法是,这可能是因为我正在通过一个array通道而不是一个向量。这是完整的代码:

#include <iostream>
#include <vector>
#include "complex.h"

using namespace std;
//using namespace Complex; 

template<typename Iterator>
vector<Complex::complex> convertToComplex(Iterator begin, Iterator end)
{
     vector<Complex::complex> vals12(10);


 for(auto i=begin; (i != end); i++)
 {
     vals12[i].re = *i;
 }

 return vals12;
 }

 class Value
 {
     public:
     template <typename Fred>
     Value(Fred begin, Fred end)
     {
          vector<Complex::complex> vec = convertToComplex(begin, end);
     }
  };

  int main()
  { 
  double vals[] = {10, 23, 23, 34, 354};
  Value v(std::begin(vals), std::end(vals));
  }

有人对我哪里出错有任何想法吗?我真的希望有人能帮助我。

更新:

template<typename Iterator>
vector<Complex::complex> convertToComplex(Iterator begin, Iterator end)
{
vector<Complex::complex> vals12(10);

size_t index = 0;

for(auto i=begin; (i != end); i++)
{
    complex c;
    c.re = *i;
    c.im = *i;

    vals12[index].re = c.re;
    vals12[index].im = c.im;

    index++;
}

return vals12;
 }

错误:

error: assigning to 'double *' from incompatible type 'double'; remove * c.re = *i;

4

3 回答 3

2

当您在初始化程序中声明i时,它采用的类型在这种情况下是指向. 然后,您尝试将该指针传递给(尽管间接通过)的索引运算符。autoforbegindoublestd::vector[i]

您将需要使用一个附加变量作为索引。

size_t index = 0;
for(auto i=begin; (i != end); i++)
{
    vals12[index++].re = *i;
}
于 2013-07-05T23:33:58.427 回答
2

其他答案已经解释了为什么您的代码无法编译。你实际上想要一个变换算法:

namespace Complex {
    struct complex_t { 
    double re; 
    double im;
  };
}
template<typename Iterator>
vector<Complex::complex_t> convertToComplex(Iterator begin, Iterator end)
{
     vector<Complex::complex_t> vals12;

     std::transform(begin, end, std::back_inserter(vals12), 
                   [](const double& d ){ return Complex::complex_t{d,0}; });

     return vals12;
 }
于 2013-07-06T00:15:51.553 回答
1

请注意,这i是一个Iterator. 但是,operator[]期望int索引进入vector. 您至少有两种解决方案:

  1. 为向量中的索引创建一个计数器。

  2. 创建一个空向量并使用push_back().

于 2013-07-05T23:32:41.053 回答