我很难理解在矢量容器中动态创建新对象的概念是如何工作的,如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_name1
和class_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;
}
}
}
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_name
或object_name
。
m_layers.push_back(vector<Neuron>());
这可能是访问get a C++ book to read或查阅课程教程,回顾您所知道的内容以及探索不同类型的构造函数/类实现的好时机。那里有很多指南/教程。
vector<b> c;
c.push_back(b);
我会解释一下:
(1)容器(名称'c;)可以根据需要扩大其内部缓冲区,以便为新元素留出足够的空间。
(2)容器在新元素的地址(位于内部缓冲区中的某个位置)调用元素的复制构造函数。这意味着:
call new(element's address) b;
因此,参数是复制构造到容器的内部缓冲区,并且您拥有的传入参数可以被销毁或释放。容器保存对象的副本,并维护所有元素的生命周期。