Список итераторов для сбора записей из разных списков

Класс TaskGroup в основном содержит список Tasks. Я хочу собрать определенные задачи 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 TO (коллекция) -> отобразить коллекцию -> выполнить задачи -> удалить выполненную задачу из коллекции« И » его первоначальный список по одному -> повторить «.
Проблема с вышеупомянутой реализацией состоит в том, что я не могу удалить запись в исходной группе (даже путем передачи по ссылке или указателю), потому что только объект является частью коллекции.

Поэтому мне нужно было бы сделать коллекцию списком итераторов!

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() функционировать? Я знаю, это звучит безумно, но сейчас я хочу знать, выполним ли мой подход …)

0

Решение

Я думаю, что ваше решение звучит разумно, и вы правы, что вам нужно будет использовать QLinkedList чтобы избежать аннулирования итератора.

Альтернативный дизайн будет дать Taskобратный указатель на TaskGroup который владеет ими, и добавить метод TaskGroup удалить Task, Task затем может потребовать, чтобы он был удален из TaskGroup когда это будет завершено.

Что-то вроде следующего (что я не пробовал):

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]