C++逐条路径地在树中找到
C++ find in tree by path
我想在树中找到一个节点(框架对象(。我将路径作为字符串,将根路径(父路径(作为输入参数,这是我的代码:
Frame* TryFindFrame(const char* framePath, const Frame* pParentFrame)
{
const Frame* pResult = NULL;
foreach(const Frame* pChildFrame, pParentFrame->ChildFrames)
{
if(pChildFrame->HasPath)
{
LPCTSTR framePathObj = NULL;
pChildFrame->GetPath(&framePathObj);
if(framePathObj != NULL)
{
// found it
if(strcmp(framePathObj, framePath) == 0)
{
pResult = pChildFrame;
break;
}
else
{
pResult = TryFindFrame(framePath, pChildFrame);
}
}
}
}
return pResult;
}
问题是当路径比 "my::test::p ath" 等 2 个元素长时,函数返回 NULL,因为在找到路径后,执行另一个递归并且 pResult 被分配为 NULL。
当我在路径中找到帧时,如何结束递归?
你的代码是如何编译的有点奇怪,因为你在返回时隐式地将const Frame* pResult
转换为Frame*
。
此外,该算法远非最佳。您只能在帧中存储与该帧对应的路径的一部分。然后,当您搜索时,您将路径拆分为多个部分,并再次检查部分节点值,因此您不必遍历不需要的子树。
无论如何,如果您不能更改 Frame
类,请像这样更改代码:
const Frame* TryFindFrame(const char* framePath, const Frame* pParentFrame)
{
foreach(const Frame* pChildFrame, pParentFrame->ChildFrames)
{
if(pChildFrame->HasPath)
{
LPCTSTR framePathObj = NULL;
pChildFrame->GetPath(&framePathObj);
if(framePathObj != NULL)
{
// found it
if(strcmp(framePathObj, framePath) == 0)
{
return pChildFrame;
}
else
{
const Frame* pResult = TryFindFrame(framePath, pChildFrame);
if (pResult)
return pResult;
}
}
}
}
return NULL;
}
相关文章:
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- 从函数角度看ID到文件路径的内部与外部映射
- boost xml parsingl将xml的路径作为变量发送
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何使用cppcheck处理半相对包含路径
- 在C++中设置基于操作系统的文件路径
- 基于编译器选项的编译二进制路径
- 按边长度递归搜索图中所有可行路径
- 使用变量值作为 PlaySound 中的路径
- 如何转换真实路径 CString c++
- 从 GUID 获取 USB 卷路径
- 查找 GCD:并非所有控制路径都返回值
- C++17 文件系统::remove_all 带有通配符路径
- 在带有尾部斜杠的路径上返回 std::filesystem::create_directories() 的值
- 获取当前正在运行的 exe 名称(不是路径)
- 如何从 Skia 路径几何体中获取网格?
- CMake 错误"源似乎不包含 CMakeLists.txt",路径/库连接问题
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)