Как лучше обрабатывать выделение элементов с помощью Qvector <Qhash <QString, QString>> - PullRequest
0 голосов
/ 04 мая 2019

у меня есть:

typedef QHash<QString,QString> CueTrack;
QVector<CueTrack> tracks;

Каждый QHash должен хранить 12 пар.

QVector должен содержать от 0 до 99 элементов, но я не могу знать, сколько их будет заранее, так как это зависит от данных, которые будут считываться во время выполнения из внешнего пользовательского файла. В среднем их ожидается около 10; в большинстве случаев от 5 до 15; редко более 20 и почти никогда не более 30 (но в некоторых очень редких случаях они могут достигать 99).

Я подумал о 2 сценариях:

a) без начального размера и изменения размера при необходимости

typedef QHash<QString,QString> CueTrack;
QVector<CueTrack> tracks;
...
tracks.resize(i+1);
tracks[i]["cmd"] = "val";
...

б) начальный размер

typedef QHash<QString,QString> CueTrack;
QVector<CueTrack> tracks(99);

Я сомневаюсь, и я хотел бы понять:

  1. Какой предпочтительный сценарий, особенно с точки зрения производительности?

  2. Есть ли другой возможный сценарий, который предпочтительнее?

  3. Должен ли squeeze() использоваться здесь? Как и когда?

1 Ответ

0 голосов
/ 06 мая 2019

Пустой QHash не занимает много места, а 99 (для компьютера) - очень маленький набор данных.

Кроме того, контейнеры Qt имеют экспоненциальную политику роста. Когда выделенное пространство контейнера становится слишком маленьким, оно удваивается.

Так что, если вы измените размер (+1), он вырастет (примерно) в степени двух.

QHash имеет преимущество перед QMap в том, что оно также может быть предварительно выделено.

Вероятно Ваша лучшая стратегия будет:

tracks.reserve(20);

// When adding a new track:
tracks.resize(i+1);
tracks[i].reserve(12); // number of pairs

Но как и во всех вопросах, касающихся производительности: Профиль, затем игнорировать: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...