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

List of iterators to collect entries from various lists

一个class TaskGroup主要包含一个Task的列表。我想从各个组 ta1ta2tb3、...收集某些任务 gagbgc、.. . 并在显示 window/class 中使用此列表。采集任务的选择与本题无关

(由于这个问题是概念性的而不是技术性的,所以示例主要是伪代码。由于我在这种特殊情况下使用 Qt,因此我将使用 Qt classes,但问题应该'仅限于此。)

class Task;

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

上面文字中的对象,ta1等,应该理解为"first task from group ga"等

现在,这不是问题:

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

doSomethingWithTheCollection(collection);

用例类似于"create tasks organized in lists --> choose certain tasks --> add them to a TO DO list (collection) --> display collection --> fulfill tasks --> delete accomplished task from collection AND its original list one at a time --> repeat"。 上述实现的问题是我不能删除原始组中的条目(甚至不能通过引用或指针传递),因为只有对象是集合的一部分。

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

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

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

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

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

编辑

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

我认为您的解决方案听起来很合理,您说得对,您需要使用 QLinkedList 来避免迭代器失效。

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

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

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

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