Скажем, у меня есть такая структура:
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 (поиск имени, фамилии и т.д.).
Есть ли лучшие решения этой проблемы?
Благодарю.
Если вы хотите иметь эффективный поиск по разным ключам, на самом деле нет способа обойтись с картами для каждого - могут быть библиотеки, которые абстрагируют это для вас, но что-то подобное все равно будет происходить за кулисами.
Но вам не обязательно иметь связанный список. Вы можете иметь обе (или все) карты с указателями непосредственно на объекты Pack
. Нет необходимости включать эти объекты Pack
во вторичную структуру.
Кроме того, вы можете использовать unordered_map
вместо map
чтобы получить ожидаемую производительность O (1), а не O (log n).
map
похожа на индекс базы данных, аlist
похож на таблицу базы данных. Они просто в памяти.