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

时间:2018-11-19 03:55:55

标签: c++

我很难理解如何在矢量容器中动态创建新对象的概念如何起作用,如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;
        }


    }

}

2 个答案:

答案 0 :(得分: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的好时机,或者查找有关类的教程,复习您所知道的知识,并探索不同类型的构造函数/类实现。那里有很多指南/教程。

答案 1 :(得分:0)

vector<b> c;
c.push_back(b);

我将给出一个解释:

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

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

call new(element's address) b;

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