从各种列表中收集条目的迭代器列表
List of iterators to collect entries from various lists
一个class TaskGroup
主要包含一个Task
的列表。我想从各个组 ta1
、ta2
、tb3
、...收集某些任务 ga
、gb
、gc
、.. . 并在显示 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>::iterator
? QMutableListIterator
有不支持"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);
}
一个class TaskGroup
主要包含一个Task
的列表。我想从各个组 ta1
、ta2
、tb3
、...收集某些任务 ga
、gb
、gc
、.. . 并在显示 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>::iterator
? QMutableListIterator
有不支持"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);
}