将值推入struct

时间:2013-07-05 23:23:55

标签: c++ oop templates iterator

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

我在这里Here问了一个问题,我正试图用它来推进。我有一个结构:

namespace Complex {

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

我希望将arrayvector推回到复杂的1D向量,如下所示:

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;

3 个答案:

答案 0 :(得分:2)

当您在i初始化程序中将auto声明为for时,begin的类型为double,在这种情况下是std::vector的指针。然后,您尝试将该指针传递给[i]的索引运算符(尽管通过size_t index = 0; for(auto i=begin; (i != end); i++) { vals12[index++].re = *i; } 间接传递)。

您需要使用其他变量作为索引。

{{1}}

答案 1 :(得分:1)

请注意,iIterator。但是,operator[]要求int的索引为vector。您至少有两个解决方案:

  1. 为矢量创建索引计数器。

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

答案 2 :(得分:1)

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

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;
 }