如果节点只包含指向其父节点的指针,我如何在 C++ 中打印到节点的路径?
How do i print the path to a node in C++ if the nodes only contain pointers to their parents?
任务是用 c++ 制作一种文件系统,用户可以在其中创建、删除、cd 进入和退出文件夹以及列出子文件夹。每次操作后,程序应打印出当前文件夹或 created/removed 文件夹的路径。我偶然发现了打印路径:
struct dir
{
std::string name;
dir* parent;
};
std::string path(dir* a)
{
if(a->parent==NULL) return "";
return path(a->parent) +"/"+ a->name;
}
示例:
#include<iostream>
#include<vector>
#include<string>
struct dir
{
std::string name;
dir* parent;
};
std::vector<dir> sys;
dir* currentdir;
std::string path(dir* a)
{
if(a->parent==NULL) return "";
return path(a->parent) +"/"+ (*a).name;
}
int main()
{
sys.push_back({"",NULL});
sys.push_back({"a",&sys[0]});
sys.push_back({"b",&sys[1]});
sys.push_back({"c",&sys[2]});
sys.push_back({"d",&sys[3]});
sys.push_back({"e",&sys[4]});
sys.push_back({"f",&sys[5]});
sys.push_back({"g",&sys[6]});
sys.push_back({"h",&sys[7]});
sys.push_back({"i",&sys[8]});
currentdir = &sys[9];
std::cout << path(currentdir);
}
这给出了输出 ////////h/i
而不是 /a/b/c/d/e/f/g/h/i
当您将新元素推入 sys
时,它最终会填满并必须重新分配其元素,此时您保存到 parent
中的所有指针都将变得无效,并且您的程序已经未定义的行为。
一个简单的解决方案是在创建任何元素之前调用 reserve
,您需要确保您永远不会超过预留容量,否则您将再次遇到同样的问题。
另一种选择是将索引存储到 sys
数组中。
任务是用 c++ 制作一种文件系统,用户可以在其中创建、删除、cd 进入和退出文件夹以及列出子文件夹。每次操作后,程序应打印出当前文件夹或 created/removed 文件夹的路径。我偶然发现了打印路径:
struct dir
{
std::string name;
dir* parent;
};
std::string path(dir* a)
{
if(a->parent==NULL) return "";
return path(a->parent) +"/"+ a->name;
}
示例:
#include<iostream>
#include<vector>
#include<string>
struct dir
{
std::string name;
dir* parent;
};
std::vector<dir> sys;
dir* currentdir;
std::string path(dir* a)
{
if(a->parent==NULL) return "";
return path(a->parent) +"/"+ (*a).name;
}
int main()
{
sys.push_back({"",NULL});
sys.push_back({"a",&sys[0]});
sys.push_back({"b",&sys[1]});
sys.push_back({"c",&sys[2]});
sys.push_back({"d",&sys[3]});
sys.push_back({"e",&sys[4]});
sys.push_back({"f",&sys[5]});
sys.push_back({"g",&sys[6]});
sys.push_back({"h",&sys[7]});
sys.push_back({"i",&sys[8]});
currentdir = &sys[9];
std::cout << path(currentdir);
}
这给出了输出 ////////h/i
而不是 /a/b/c/d/e/f/g/h/i
当您将新元素推入 sys
时,它最终会填满并必须重新分配其元素,此时您保存到 parent
中的所有指针都将变得无效,并且您的程序已经未定义的行为。
一个简单的解决方案是在创建任何元素之前调用 reserve
,您需要确保您永远不会超过预留容量,否则您将再次遇到同样的问题。
另一种选择是将索引存储到 sys
数组中。