我有2d vector 与对象

std::vector<std::vector<perceptron>> p;

现在我想像这样分配对象perceptron
PrintRectangle::PrintRectangle(QWidget *parent) : QWidget(parent),
    p(5, std::vector<perceptron>(5))
{

    tech = new teacher(clicked);


    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            p[i][j] = new perceptron();
            p[i][j].randweight();
        }
    }

    double learnConst = 0.1;
    //tech->learnPerceptrons(p);
}

但我得到一个错误
E:\Sieci Neuronowe\Perceptron\printrectangle.cpp:16: error: no match for 'operator=' (operand types are '__gnu_cxx::__alloc_traits<std::allocator<perceptron> >::value_type {aka perceptron}' and 'perceptron*')
             p[i][j] = new perceptron();
                     ^

我该如何修理?

编辑:

我以C#中的代码为模型
Perceptron[] p;

 p = new Perceptron[10];

 for (int i = 0; i < 10;i++)
 {
      p[i] = new Perceptron();
      p[i].randweight();
 }

在C#中,此代码可以正常工作。
它如何适合C++

最佳答案

new运算符创建一个指向perceptron实例的指针,因此编译器错误是正确的(perceptron*!= perceptron)。

幸运的是,创建 vector 时,该 vector 已经预先创建了所有perceptron实例,因此您只需删除相关行即可。

PrintRectangle::PrintRectangle(QWidget *parent) : QWidget(parent),
    p(5, std::vector<perceptron>(5))  // <----------- 25 perceptron objects created here!
{

    tech = new teacher(clicked);


    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            // p[i][j] = new perceptron(); NO NEED FOR THIS LINE
            p[i][j].randweight();
        }
    }

    double learnConst = 0.1;
}

编辑:对于您的更新问题(即如何使C++代码与C#代码匹配),您可以使用智能指针来存储perceptron对象:
PrintRectangle::PrintRectangle(QWidget *parent) : QWidget(parent),
    p(5, std::vector<std::unique_ptr<perceptron>>(5))
{

    tech = new teacher(clicked);


    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            p[i][j].reset(new perceptron)
            p[i][j]->randweight();
        }
    }

    double learnConst = 0.1;
}

我在这里选择了一个unique_ptr来存放perceptron指针,但是您应该确定自己的所有权要求,并根据需要选择最佳的指针类型(例如unique_ptrshared_ptr,raw指针等)。

但是,除非您确实需要将代码与C#的功能匹配,否则,通过避免指针开销(例如,取消引用),您的代码可能会比原始方法更快(并且更易于使用)。

08-19 13:44