Оптимизирован поиск различных полей в объекте

0

Скажем, у меня есть такая структура:

struct Pack
{
    unsigned int id;
    string name;
    string surname;
    string username;
    string address;
};

Если я хочу найти заданное "имя пользователя" в коллекции этого типа объектов, я могу сохранить их в std :: map с "именем пользователя" в качестве ключа и правильного объекта пакета как значения.

Но что, если я хочу также искать данный ID?

Решение, с которым я столкнулся с этой проблемой, состояло в том, чтобы иметь данные в другой структуре данных (например, связанный список) и 2 разделенных std :: maps. Первая карта будет иметь "имя пользователя", а вторая - "id". В качестве значения они оба будут иметь указатель на соответствующий объект Pack.

Кроме того, я забыл упомянуть одну важную вещь. Если я также хочу удалить объект, мне также нужно будет удалить записи из двух std :: maps. И процедура удаления будет "тяжелее", если я хочу увеличить количество std :: maps (поиск имени, фамилии и т.д.).

Есть ли лучшие решения этой проблемы?

Благодарю.

  • 0
    Если важна производительность, не используйте связанный список ... это сложная структура. Вы должны использовать массив-структуру. взгляните на упакованную структуру
  • 0
    @Mike Майк Ваше решение хорошее. Каждая map похожа на индекс базы данных, а list похож на таблицу базы данных. Они просто в памяти.
Показать ещё 3 комментария
Теги:
algorithm
data-structures
design-patterns

1 ответ

0
Лучший ответ

Если вы хотите иметь эффективный поиск по разным ключам, на самом деле нет способа обойтись с картами для каждого - могут быть библиотеки, которые абстрагируют это для вас, но что-то подобное все равно будет происходить за кулисами.

Но вам не обязательно иметь связанный список. Вы можете иметь обе (или все) карты с указателями непосредственно на объекты Pack. Нет необходимости включать эти объекты Pack во вторичную структуру.

Кроме того, вы можете использовать unordered_map вместо map чтобы получить ожидаемую производительность O (1), а не O (log n).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню