QMap и QPair, C++, Qt

Я хочу сделать структуру данных для доступа к строкам двумя способами:

  1. доступ по ID
  2. открыть на имя

моя первая идея, используя две карты для каждого метода, но это приводит к дублированию данных:

QMap<int, QString> accessById;
QMap<QString, QString> accessByName;

Я ищу лучший способ, что-то вроде этого:

QMap<QPair<int, QString>, QString> multiAccess;

но он не может мне помочь (по крайней мере я не знаю как это сделать), потому что поиск на карте нужно знать идентификатор и имя вместе. Как может Я определяю хорошую структуру классов Qt для достижения моей цели?

нет внешних библиотек, но Qt

3 ответов


Как насчет:

QMap<QString, int> nameIdMap;
QMap<int, QString> accessById;

вы получаете доступ по id и создаете карту для имен и идентификаторов. Тогда вы можете получить доступ по имени с

QString data = accessById[nameIdMap[the_name]];

Qt не так сильно беспокоится о дублировании данных, как многие другие библиотеки классов, из-за"неявного совместного использования":

http://doc.qt.nokia.com/latest/implicit-sharing.html

список классов, которые имеют это свойство (которые включают QString) покрывается этой ссылкой. Есть помощники для создания собственных классов, которые используют стратегию копирования при записи как хорошо:

http://en.wikipedia.org/wiki/Copy-on-write

http://doc.qt.nokia.com/latest/qshareddatapointer.html#details

подводя итог: если у вас есть QString 10,000 символов и назначить его другой переменной QString, вы не будете платить за еще 10,000 символов хранения (Если вы не измените строковые данные одного из двух экземпляров). Тем не менее, даже дескриптор QString только для чтения немного больше, чем int. Он зависит от вашего сценария, является ли эта разница в размере значительной по сравнению со скоростью компромисса нескольких поисков, как в стратегии, предлагаемой @Juho.


можно использовать Повышение Bimap который создаст двунаправленную карту между идентификатором и именем.

boost::bimap<int, QString> idNameBimap;