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>::iterator
? QMutableListIterator
具有不支持“迭代器算术”的缺点。 (我不想传递整个列表......我可以传递一个函数指针到相应的 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/