PavelK
@PavelK

Какой контейнер/методология сможет заменить Map из JavaScript?

Приветствую!
Очень хочется найти аналог Map из JavaScript (если правильно понял):
В Qt есть QMap, но вот нужно, что бы ключи были без сортировки, а итератор проходил их всегда в порядке вставки, а не в порядке сортировки значения ключа. QHash не подходит из-за псевдо случайного, и QVector то же(у него пустые элементы то же учитываются итератором + размер будет гигантским, если будет да же пара ключей с большим разрывом между ними). В QList индексы просто по порядку должны идти, без пропусков и не получится сразу взять и вставить на 42 место.
Предложите, пожалуйста, оптимальные варианты... P.S. Важна производительность.
  • Вопрос задан
  • 413 просмотров
Решения вопроса 3
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Как вариант, написать аналог самостоятельно или подглядеть реализацию в исходных кодах js движка v8
Ответ написан
Комментировать
myjcom
@myjcom Куратор тега C++
аналог Map из JavaScript

Типа
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;

template<typename Key, typename Val>
class Map
{
  map<Key, Val> values;
  vector<Key> index;
public:
  // ...
  auto operator[](int i)
  {
    return values[index[i]];
  }
  // ...
  void insert(const pair<Key, Val>& val)
  {
    values[val.first] = val.second;
    index.push_back(val.first);
  }
  // ...
};

int main()
{
  Map<int, string> mp;

  mp.insert({3, "three"});
  mp.insert({42, "forty two"});
  mp.insert({2, "two"});
  mp.insert({4, "four"});

  for(int i = 0; i < 4; ++i)
  {
    cout << mp[i] << "\n";
  }
}


Или
loki-lib.sourceforge.net/html/a00645.html
Ответ написан
Комментировать
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Насчёт JS не знаю, но, судя по описанию, вам необходима структура данных, которая называется FlatMap (есть например в бусте), ну или по крайней мере, сильно на неё похожая.
В общем и целом, можете написать свою структуру данных вроде std::vector<std::pair<KeyType, ValueType>>. Ну а базовый контейнер выбрать в зависимости от того, какие операции будут применяться к структуре наиболее часто, я просто вектор для примера привёл.

К слову
В QList индексы просто по порядку должны идти, без пропусков и не получится сразу взять и вставить на 42 место.

Подразумевает наличие 42 элементов (не важно пустых или нет), что вам, кажется, не надо. Поэтому, уточните плз, какую задачу вы решаете и какие реально есть требования к структуре данных.

upd.
Посмотрел доку на JS, похоже там реально flat map.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы