gpt4 book ai didi

c++ - 从各种列表中收集条目的迭代器列表

转载 作者:行者123 更新时间:2023-11-28 05:20:51 29 4
gpt4 key购买 nike

A类TaskGroup主要包含Task的列表秒。我想收集某些任务ta1 , ta2 , tb3 , ... 来自各个团体 ga , gb , gc , ... 并在显示窗口/类中使用此列表。采集任务的选择与本题无关。

(由于这个问题是概念性的而不是技术性的,所以示例主要是伪代码。由于我在这个特定案例中使用 Qt,所以我将使用 Qt 类,但问题不应该仅限于这个案例.)

class Task;

class TaskGroup {
QString name;
QList<Task> tasklist;
...
}

上面文本中的对象,ta1等等,应该理解为“第一个任务来自组ga”等。

现在,这不是问题了:

QList<Task> collection;
collection.append(ga.getTask(1));
...
collection.append(gb.getTask(3));
...

doSomethingWithTheCollection(collection);

用例类似于“创建按列表组织的任务 --> 选择某些任务 --> 将它们添加到 TO DO 列表(集合) --> 显示集合 --> 完成任务 --> 删除已完成的任务来自集合及其原始列表,一次一个——> 重复”。上述实现的问题是我不能删除原始组中的条目(甚至不能通过引用或指针传递),因为只有对象是集合的一部分。

因此,我需要将集合设为迭代器列表!

QList<QList<Task>::iterator> collection;
collection.append(ga.getIteratorToTask(1));
...

因为我可以通过取消引用使用相应的任务,完成后我可以通过 collection[x].erase(); 删除它然后它们从原始列表中消失。

到目前为止我的想法是否正确?或者这甚至是一个复杂的概念?

如果集合中每个列表有多个任务,我必须使用 QLinkedList ,因为在操纵了一般QList之后,迭代器变得无效......因此我应该实现TaskGroup吗?类 QLinkedList而不是 QList

编辑

在将这个概念付诸实践时,我失望地发现 erase(iterator)QList 的一部分类而不是迭代器本身。看来,我因此无法像我希望的那样仅通过迭代器删除原始列表中的条目……我需要该列表。有什么解决办法吗?也许使用类似 Java 的 QMutableListIterator及其 remove()方法而不是 QList<Task>::iteratorQMutableListIterator具有不支持“迭代器算术”的缺点。 (我不想传递整个列表......我可以传递一个函数指针到相应的 QList<Task>::erase() 函数吗?我知道这听起来很疯狂但在这一点上,我想知道我的方法是否可行...... .)

最佳答案

我认为您的解决方案听起来很合理,而且您认为需要使用 QLinkedList 来避免迭代器失效是正确的。

另一种设计是为 Task 提供指向拥有它们的 TaskGroup 的后向指针,并向 TaskGroup 添加一个方法以删除一个任务Task 然后可以请求在完成后将其从 TaskGroup 中删除。

类似于以下内容(我还没有尝试过):

void Task::Complete()
{
parent->RemoveTask(*this);
}

void TaskGroup::RemoveTask(Task& task)
{
tasklist.removeAll(task);
}

关于c++ - 从各种列表中收集条目的迭代器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41532952/

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