迭代器列表,用于从各种列表中收集条目

List of iterators to collect entries from various lists

本文关键字:列表 用于 迭代器      更新时间:2023-10-16

TaskGroup主要包含Tasks的列表。我想收集某些任务ta1ta2tb3。。。来自各个组gagbgc。。。并在显示窗口/类中使用该列表。收集任务的选择与此问题无关。

(因为这个问题是概念性的,而不是技术性的,所以这些例子大多是伪代码。由于我在这个特定的情况下使用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);

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

因此,我需要使集合成为迭代器列表!

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

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

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

如果集合中每个列表有一个以上的请求,我必须使用QLinkedList,因为在操作通用QList之后,迭代器将无效。。。因此,我应该用QLinkedList而不是QList来实现TaskGroup类吗?

编辑

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

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

另一种设计是给Tasks一个指向拥有它们的TaskGroup的返回指针,并向TaskGroup添加一个方法来删除Task。当CCD_ 29已经完成时,CCD_。

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

void Task::Complete()
{
parent->RemoveTask(*this);
}
void TaskGroup::RemoveTask(Task& task)
{
tasklist.removeAll(task);
}