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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект