私はjavaからC++にいくつかのクラスを移植しようとしています。C++ std :: vector problems
class ForwardNetwork {
protected:
ForwardLayer* inputLayer;
ForwardLayer* outputLayer;
vector<ForwardLayer* > layers;
public:
void ForwardNetwork::getLayers(std::vector< ForwardLayer* >& result) {
for(int i= 0 ;i< layers.size(); i++){
ForwardLayer* lay = dynamic_cast<ForwardLayer*>(this->layers.at(i));
if(lay != NULL)
result.push_back(lay);
else cout << "Layer at#" << i << " is null" << endl;
}
}
void ForwardNetwork::addLayer (ForwardLayer* layer) {
if(layer != NULL)
cout << "Before push layer is not null" << endl;
//setup the forward and back pointer
if (this->outputLayer != NULL) {
layer->setPrevious (this->outputLayer);
this->outputLayer->setNext (layer);
}
//update the input layer and outputLayer variables
if (this->layers.size() == 0)
this->inputLayer = this->outputLayer = layer;
else this->outputLayer = layer;
//push layer in vector
this->layers.push_back (layer);
for(int i = 0; i< layers.size();i++)
if(layers[i] != NULL)
cout << "Check::Layer[" << i << "] is not null!" << endl;
}
void ForwardNetwork::reset() {
std::cout<< "Network size#" << this->layers.size() << std::endl;
int index = -1;
for (int i = 0; i< this->layers.size(); i++){
cout << "Layer[" << i << "] address#" << layers[i] << endl;
if(layers[i] != NULL){
layers[i]->reset();
}
else cout << "Layer NULL";
}
}
};
セカンドクラス:
class Backpropagation : public Train {
public:
Backpropagation::Backpropagation (ForwardNetwork* network){
this->network = network;
vector<ForwardLayer*> vec;
network->getLayers(vec);
}
};
主な機能:今、私はメインから追加する場合
ForwardNetwork* network = new ForwardNetwork();
ForwardLayer* layer2= new ForwardLayer(2);
network->addLayer(layer2);
ForwardLayer* layer3 = new ForwardLayer(3);
network->addLayer(layer3);
ForwardLayer* layer1 = new ForwardLayer(1);
network->addLayer(layer1);
network->reset();
Train* train = new Backpropagation(network);
()いくつかの
それでは、私たちは、この2つのクラスを持っているとしましょうaddLayer(..)メソッドを使用してネットワークにレイヤーを追加することができます。私のベクターはちょうどそれと同じです。しかし、私はBackpropagation()コンストラクト私がgetLayers()を入力すると、ベクトルからのオブジェクトのいくつかは、NULLに設定されたアドレスを持っています(ランダムに選択されます:例えば、 2回目は最初に2つのオブジェクトがヌル、3回目は最初のオブジェクトがヌルになるなど)。 これはなぜ起こっているのか説明できません。私はベクトル内になければならないすべてのオブジェクトもネットワーク内にあり、NULLではないと言わなければなりません。
これは、getLayers()だけでなく、addLayer()で行った後でも起こります。 私はこの問題をよく理解できません。私は私のベクトルを修正するかもしれないと最初に考えました。しかし、私はそのようなものを見つけることはできません。 また、ベクトルからの参照がNULLの場合、ForwardNetwork内にリンクリスト(inputLayerとoutputLayer)として存在する参照がNULLではないのはなぜですか?
PS:Ubuntuの11.10
「ベクトル」と書くと、間違っている可能性があります。ベクトルにポインタを格納する必要はありません。実際にはポインタは悪いことです。コンテナのメモリ管理能力を迂回しています。 –
ポインタのベクトルに有効なユースケースがいくつかあります。たとえば、あるベクトルが別のベクトルで実行されたアルゴリズムの結果を保持している場合はどうでしょうか?たとえば、常にそれらをすべてコピーしますか?私はその例では、>は、おそらく、これらの日に行く方法だと言います。 –
Benj
shared_ptrのベクタは、ベクタが内部ストレージを再割り当てする必要があるときはいつも、メモリオーバーヘッドと簿記オーバーヘッドを導入しませんか? –