gpt4 book ai didi

c++ - 通过树状系统进行高效迭代

转载 作者:行者123 更新时间:2023-11-28 07:33:29 24 4
gpt4 key购买 nike

我有一个树状系统,它由一个对象创建,该对象包含对另一种类型对象的引用列表,该对象包含对另一个对象的引用列表……等等。

因此给了我一棵对象树,所有类型都不同。

现在,我现在正在做的只是简单地使用“for each”循环来获取其父元素下的每个元素,直到我找到我想要的对象。 (这些对象包含一个我也需要访问的字符串。如果这个字符串匹配我正在寻找的内容,那么我设置一个标志。可能有多个匹配项,但我只需要确认一个。)

这提出了另一个问题,即设置该标志后应该发生什么,因为我不需要再继续了。这是因为如果在一个字符串上找到匹配项,那么我可以假设我可以继续我的程序的其余部分。因此,这使得树上的其余迭代毫无意义。

我在 C++ MFC 中工作,因此如果重要的话,我正在搜索 CString。

包含“子”对象的容器层以父对象的 Vector 开始,然后是子对象列表,然后是子对象列表。

让树的一个分支看起来像:


初始 vector :{ 1object1, 1object2, 1object3, ..., 1objectN }



object1 列表:{ 2object1, 2object2, 2object3, ...,2objectN }

2object1 列表:{ 3object1, ... 3objectN }

如果(3object1.name()==“匹配”)
{
标志=真;
休息?
}

为了保持问题的通用性,即使我使用的是 vector 和列表,我对所使用的实现也不太挑剔。

我的实际代码是这样的:



bool flag = FALSE;
对于每个(m_1Objects 中的 1Object 1object)
对于每个(1object.Get2Objects()中的2Object 2object)
对于每个(2object.Get3Objects() 中的 3Object 3object)
如果(3object.GetName()==“匹配”)标志=真;

如您所知,一旦系统变得太大,这可能需要永远运行。特别是因为我不确定在设置标志后如何摆脱它。

执行此操作的更有效、更清洁的方法是什么?

最佳答案

好吧,有几种方法可以处理它。

最简单且“最 hackiest”的方法是在找到项目后抛出异常并在循环外捕获它。不整洁,不好,但它会工作。您仍然可以使用 std::for_each。为了说明(不是我赞成这个解决方案):

bool flag = FALSE;                                                                                                                                                  
try {
for each (1Object 1object in m_1Objects)
for each (2Object 2object in 1object.Get2Objects())
for each (3Object 3object in 2object.Get3Objects())
if (3object.GetName() == "match") throw true;
} catch (bool e) {
flag = TRUE;
}

另一种方法是使用std::find_if代替std::for_each,并在每一层检查find_if返回的迭代器是否> 是最后还是不是。 (最后一个表示找不到项目)。

但我认为最简单的方法是使用包含标志的条件语句将 foreach 迭代实现为简单的 for 循环,例如这段代码

bool flag = 0;
for (int i = 0; i < 10 && !flag; ++i) {
std::cout << i << std::endl;
if (5 == i)
flag = true;
}

会输出

0
1
2
3
4
5

这对您的问题有帮助吗?

关于c++ - 通过树状系统进行高效迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17200785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com