У меня есть приложение, которое работает с данными в следующей структуре:
struct Message
{
int time;
string name;
string details;
};
Например, у меня может быть набор данных, который выглядит следующим образом:
9:00:00 Bob <Info>
9:01:00 John <Info>
9:05:00 Bob <Info>
9:11:00 Mary <Info>
9:17:00 John <Info>
9:25:00 Mary <Info>
9:30:00 Bob <Info>
И у меня будет список Message
структур, которые представляют каждую строку в наборе данных.
Некоторые операции, которые мне нужно будет выполнить с этими данными, включают:
- Соберите все данные в хронологическом порядке и
dostuff()
- Соберите все данные от
John
(или от кого угодно) в хронологическом порядке и dostuff()
Итак, мне нужен способ пройти список, чтобы я мог передать каждое сообщение в хронологическом порядке, а также выбрать человека и пропустить только его сообщения в хронологическом порядке.
Мои мысли должны иметь такую структуру:
struct Node
{
Message* message;
Node* next_time;
Node* next_name;
};
, в котором next_time
указывает на следующее Node
в хронологическом порядке, а next_name
указывает на следующее Node
, которое принадлежит message->name
. И структура Root
указывает на первый из каждого типа.
struct Root
{
Node* first_time;
Node* first_bob;
Node* first_john;
Node* first_mary;
Node* last_time;
Node* last_bob;
Node* last_john;
Node* last_mary;
};
Вот изображение, иллюстрирующее точку.
Эта структура позволяет мне довольно легко проходить через каждое сообщение, или только через сообщения Боба, или только через Джона и т. Д.
Однако меня беспокоит, что, может быть, это сложнее, чем нужно. У меня также есть проблемы по обслуживанию (см. Ниже). Мне нужно, чтобы операции поиска / выбора / чтения были довольно быстрыми, что я и считаю. И мне нужно, чтобы операции вставки были достаточно быстрыми. Но сейчас, для каждой вставки Message
, я должен (1) обновить некоторый указатель next_time
и (2) обновить указатель next_name
.
Мой вопрос:
Существует ли структура данных, которая уже обеспечивает такую функциональность? Если нет, правильно ли я подхожу к этой проблеме?
Пожалуйста, предоставьте любые примеры кода на C ++ или C #, если это возможно.
Спасибо.
Дополнительно: предположим, позже я захочу добавить в мою Message
структуру. Допустим, я добавляю поле с именем City
. Теперь я могу сделать это:
- Соберите все данные из определенного
City
в хронологическом порядке и dostuff()
Для этого потребуется добавить next_city
, а затем для каждой вставки мне придется обновить next_time
, next_name
, И next_city
.
Далее, предположим, я хочу сделать это:
- Соберите все данные из определенного
City
И определенного name
в хронологическом порядке и dostuff()
Я думаю, что это невероятно усложнит проблему, если я не решу пройти через все Message
и пропустить те, которые мне не нужны.