특히 gn가 null인 경우에는 작동하지 않습니다. 문제를 해결할 수 있도록 도와주시겠어요? 또한 모든 코드를 결합하세요.
응답
제공된 코드에 몇 가지 문제가 있습니다.
Null 포인터 역참조: 가장 심각한 문제는 gn->val 및 gn->adj_nei에 액세스하기 전에 gn에 대한 null 검사가 없다는 점입니다. dcGraph(nullptr)이 호출되면 코드가 비정상 종료됩니다.
비효율적인 심층 복사: 코드는 중복 복사를 방지하기 위해 맵을 사용하여 심층 복사를 시도하지만 최적의 효율성을 제공하지는 않습니다. v 맵에서 반복적으로 조회하면 특히 대규모 그래프의 경우 오버헤드가 발생할 수 있습니다.
다음은 변경사항에 관한 설명이 포함된 개선된 코드입니다.
#include <vector>#include <map>classGraphNode{public:intval;std::vector<GraphNode*>adj_nei;GraphNode(){val=0;adj_nei=std::vector<GraphNode*>();}GraphNode(int_val){val=_val;adj_nei=std::vector<GraphNode*>();}GraphNode(int_val,std::vector<GraphNode*>_adj_nei){val=_val;adj_nei=_adj_nei;}};classGraphNodeDeepCopy{private:std::map<GraphNode*,GraphNode*>v;public:GraphNode*dcGraph(GraphNode*gn){// Handle null input gracefullyif(gn==nullptr){returnnullptr;}if(v.find(gn)!=v.end()){returnv[gn];}// Create a new node. Note: We don't need to initialize adj_nei here.GraphNode*dcGraphNode=newGraphNode(gn->val);v[gn]=dcGraphNode;// Recursively copy the neighborsfor(GraphNode*nei:gn->adj_nei){dcGraphNode->adj_nei.push_back(dcGraph(nei));}returndcGraphNode;}};
주요 개선사항:
null 검사:dcGraph 함수 시작 부분에 if (gn == nullptr) { return nullptr; }를 추가하면 null 포인터가 전달될 때 비정상 종료가 방지됩니다. 이는 강력한 코드에 매우 중요합니다.
간소화된 생성자 사용:GraphNode 생성자가 더 효율적으로 사용됩니다. 재귀 복사 중에 채우므로 dcGraphNode 생성 시 adj_nei를 미리 초기화할 필요가 없습니다. 이렇게 하면 성능과 가독성이 약간 개선됩니다.
이 수정된 코드는 null 포인터 역참조를 해결하고 더 강력하고 약간 더 효율적인 심층 복사 함수를 제공합니다. 복사된 그래프를 완료할 때 메모리 누수를 방지하려면 new에서 할당된 메모리를 delete를 사용하여 관리해야 합니다. 스마트 포인터 (예: std::unique_ptr 또는 std::shared_ptr)을 사용합니다.
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["번역 문제","translationIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2024-12-05(UTC)"],[],[]]