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

时间:2017-01-08 12:58:15

标签: c++ linked-list conceptual qlist qlinkedlist

班级TaskGroup主要包含Task个列表。我想从各个小组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);

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

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

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

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

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

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

修改

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

1 个答案:

答案 0 :(得分:1)

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

另一种设计是给Task一个指向拥有它们的TaskGroup的指针,并向TaskGroup添加一个方法来删除Task。然后Task可以请求TaskGroupvoid Task::Complete() { parent->RemoveTask(*this); } void TaskGroup::RemoveTask(Task& task) { tasklist.removeAll(task); } 完成后将其删除。

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

$CBjson->ips = explode(", ", $ips);