使用push_back()方法在向量容器中创建新对象

问题描述 投票:-2回答:2

我很难理解在矢量容器中动态创建新对象的概念是如何工作的,如link在18:30时所见。似乎作者构造了一个类似的向量

class a;
typedef vector<a> b;
.
.
.
vector<b> c;
.
. 
.
for (unsigned x=0;x<num_of_b_obj.size();x++){
c.push_back(b); //seems to be a way to dynamically create an array 
                //of objects of b in vector container c
}

有谁知道这是如何工作的,有没有这个概念的良好文档?

构造对象的典型方法是实例化类,然后是对象名称,如class_name object_name1class_name object_name2,然后像object_name1.function_a一样自由地使用对象成员。使用向量容器构造对象的问题似乎是,如果没有可见的方法为构造对象分配名称,那么如何使用不同对象的成员函数?

下面是真正的代码...显示“push_back()”方法似乎在循环中创建新对象

class Neuron(){};

typedef vector<Neuron> Layer;

class Net {

public:
    Net(vector<unsigned> &topology) // class constructor
    void feedForward(const vector<double> &inputVals) {}; // passing 
inputVals by reference rather than by value, because inputVals will be too 
HUGE to pass by copying the value.
    void backProp(const vector<double> &targetVals) {};
    void getResults(vector<double> &resultVals) const {};
private:
    vector<Layer> m_layers; // m_layer[layerNum][neuronNum]
};


Net::Net(vector<unsigned> &topology)
{
    unsigned numLayers = topology.size();
    for (unsigned layerNum=0;layerNum < numLayers;++layerNum){
        m_layers.push_back(Layer()); // create new empty layer, to fill with the i'th neuron

        for(unsigned neuronNum=0; neuronNum <= topology[layerNum];++neuronNum){
            m_layers.back().push_back(Neuron()); // ".back()" to access the newly created layer, ".push_back()" to append the new neuron in the new layer 
            cout<< "Made a neuron foo !!" << endl;
        }


    }

}
c++
2个回答
1
投票
m_layers.push_back(Layer());

相当于

m_layers.push_back(vector<Neuron>());

这会调用构造函数的向量。您的示例代码和实际代码之间遗漏的重要事情是

c.push_back(b);   // compiler error since `b` is a type

应该

c.push_back(b());

括号可以有所作为。

vector<Neuron>() // this constructs an empty vector of neurons.
vector<Neuron>   // this is a type.

“push_back()”方法似乎在循环中创建新对象

我认为你误解了构造函数是如何工作的。

在将对象推入向量之前创建对象。所以这并不是真正的push_back()正在创造。

m_layers.push_back(vector<Neuron>());
//                 ^^^^^^^^^^^^^^^^    // a new object is created

// ...

m_layers.push_back(aNewObject);        // the new object is passed into `push_back`

// ...   

幕后真正发生的事情是,push_back()将对象复制到矢量中。所以惊喜,

m_layers.push_back(vector<Neuron>());

实际上创建了两个对象,但其中一个被快速销毁,而另一个被存储到向量中。

构造对象的典型方法是实例化类,然后是对象名,如class_name object_name1

这是做到这一点的一种方式,并没有错。

vector<Neuron> someNeuron;
m_layers.push_back(someNeuron);

这样可行。它会精细编译。但由于我们不会在其他地方使用变量someNeuron,我们可以“动态”执行此操作,而无需使用instance_nameobject_name

m_layers.push_back(vector<Neuron>());

这可能是访问get a C++ book to read或查阅课程教程,回顾您所知道的内容以及探索不同类型的构造函数/类实现的好时机。那里有很多指南/教程。


0
投票
vector<b> c;
c.push_back(b);

我会解释一下:

(1)容器(名称'c;)可以根据需要扩大其内部缓冲区,以便为新元素留出足够的空间。

(2)容器在新元素的地址(位于内部缓冲区中的某个位置)调用元素的复制构造函数。这意味着:

call new(element's address) b;

因此,参数是复制构造到容器的内部缓冲区,并且您拥有的传入参数可以被销毁或释放。容器保存对象的副本,并维护所有元素的生命周期。

© www.soinside.com 2019 - 2024. All rights reserved.