如何将对象分配到2D矢量no Match oterator =

How to assignment object to 2d vector no match for operator=

本文关键字:no 矢量 Match oterator 2D 对象 分配      更新时间:2023-10-16

我有2D向量

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 NeuronowePerceptronprintrectangle.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)。

幸运的是,当您创建向量时,矢量已经预先创建了所有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#匹配,否则您的代码可能会更快(并且更易于使用)您做的方式会更快(并且更易于使用)最初是通过避免指针开销(例如退出)。

new perceptron()将指针返回到percepteron。如果您希望将perceptron对象单独分配,则需要将p更改为vector<vector<pecepteron *>>(或者更好,是percepteron的适当智能指针)。如果单个堆分配并不重要,并且percepteron具有可接受的初始化的默认构造函数,那么您根本不需要此分配 - 单个vector<percepteron>对象的分配将已经运行此构造函数。

<</p> <</p>