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;
}
}
}
答案 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_name
或object_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;
因此,您的参数将被复制构造到容器的内部缓冲区中,并且您拥有的传入参数可以被破坏或释放。容器保存对象的副本,并保留所有元素的生命周期。