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

标签 c++ linked-list conceptual qlist

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

相关文章:

c - 通过 LinkedList 进行线性搜索

ios - 理想情况下我应该如何创建一个结构良好的 UITableViewDataSource?

c++ - 如何列出 .so 文件中的符号

c - 如何删除具有特定值的节点?

c++ - std::async 与类成员函数

c++ - 使用链接列表插入 Pop 功能

javascript - JS如何既是非阻塞/异步又是单线程的?

conceptual - 您将使用哪个比喻来描述编程?

c++ - 使用 swig 将 python StringIO 传递给 C++ stringstream

C++ 异步 + future (延迟 vs 异步)