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";
}
}
};
2 등석 :
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);
() 일부
그럼 우리가이 개 수업을 가정 해 봅시다 addLayer (..) 메소드를 통해 네트워크에 레이어를 추가하는 것이 좋습니다. 내 벡터는 꼭 그래야합니다.하지만 Backpropagation() constructo r은 네트워크 객체와 함께 getLayers()를 입력 할 때 벡터의 객체 중 일부가 NULL로 설정된 주소를가집니다 (무작위로 선택됨 : 예를 들어 3 계층을 벡터로 한 번 실행하면 벡터의 첫 번째 객체 두 번째 시간에 처음으로 2 개의 객체가 null 인 경우 세 번째로 첫 번째 객체가 null이되는 등). 이제는 왜 이런 일이 일어나는지 설명 할 수 없습니다. 벡터에 있어야하는 모든 객체는 네트워크 내부에도 존재하며 NULL이 아니며,
getLayers()뿐만 아니라 addLayer()를 사용하면 모든 곳에서 발생합니다. 나는이 문제를 잘 이해하지 못한다. 나는 내 벡터를 수정할지도 모른다고 처음에 생각했다. 그러나 나는 그런 것을 찾을 수 없다. 또한 vector의 참조가 NULL 인 경우 ForwardNetwork 내부의 링크 된 목록 (inputLayer 및 outputLayer)에있는 참조가 NULL이 아닌 이유는 무엇입니까?
추신 : 컴파일러로 난 당신이 당신이 다형성 주조 어떤 종류의 일을하지 않는 ForwardNetwork::getLayers
의 내부 dynamic_cast
을 필요로하고 있음을 증명하고자 할 이유가 없다 11.10
'벡터'이라고 쓸 때마다 틀릴 것입니다. 벡터에 포인터를 저장할 필요가 없으며 실제로는 나쁜 것입니다. 컨테이너의 메모리 관리 기능을 우회하고 있습니다. –
포인터의 벡터에 대한 몇 가지 유즈 케이스가 있다고 생각합니다. 벡터가 다른 알고리즘 (예 :)에서 수행 된 알고리즘 결과를 유지하는 경우 항상 모든 것을 복사하고 싶습니까? 나는 그 예에서 벡터 >이 아마 요즘가는 길이라고 말할 수 있습니다. –
Benj
벡터가 내부 저장소를 재 할당해야 할 때마다 shared_ptr의 벡터가 메모리 오버 헤드와 부기 오버 헤드를 유발하지 않을까요? –