QMap и QPair, C ++, Qt - PullRequest
       4

QMap и QPair, C ++, Qt

8 голосов
/ 04 октября 2011

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

  1. Доступ по идентификатору
  2. Доступ по имени

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 04 октября 2011

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

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

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

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.

4 голосов
/ 04 октября 2011

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

boost::bimap<int, QString> idNameBimap;
4 голосов
/ 04 октября 2011

Как насчет:

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

Вы получаете доступ по идентификатору и создаете карту для имен и идентификаторов. Затем вы можете получить доступ по имени с помощью

QString data = accessById[nameIdMap[the_name]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...