Я ищу наиболее эффективную структуру данных для поддержки индексированного списка. Вы можете легко просмотреть его interms из карты STL:Структура данных C++ для выполнения индексированного списка
std::map<int,std::vector<int> > eff_ds;
Я использую это в качестве примера, потому что я в настоящее время с помощью этой установки. Операциями, которые я хотел бы выполнить, являются:
- Вставить значения на основе ключа: аналогично eff_ds [key] .push_back (..);
- Распечатайте содержимое структуры данных в терминах каждого ключа.
Я также пытаюсь использовать неупорядоченный карту и вперед список,
std::unordered_map<int,std::forward_list<int> > eff_ds;
Это лучшее, что я мог бы сделать с точки зрения времени, если я использую C++ или есть другие варианты?
UPDATE:
я могу сделать вставку в любом случае - вперед/назад до тех пор, как я сделать то же самое для всех ключей. Чтобы сделать мою проблему более ясной, рассмотрите следующее:
На каждой итерации моего алгоритма у меня будет внешний блок, который даст мне (ключ, значение) - оба из которых являются одиночными целыми числами - пара в качестве вывода , Конечно, мне придется вставить это значение в соответствующий ключ. Кроме того, при разных итерациях один и тот же ключ может быть возвращен с разными значениями. В конце концов, мои выходные данные (записанные в файл) должен выглядеть следующим образом:
k1: v1 v2 v3 v4
k2: v5 v6 v7
k3: v8
.
.
.
kn: vm
Число этих итераций довольно большой ~ 1м.
Любой из них звучит как хорошие решения. Почему их недостаточно? У вас есть особые требования, которые делают их недействительными? Являются ли ваши наборы данных достаточно большими, чтобы это имело значение? Какую конкретную операцию вы больше всего беспокоите (поиск? Удаление? Вставка?) –
Меня касается только вставка с задней/передней, это не имеет значения. Мои наборы данных довольно большие, в том смысле, что количество возможных ключей может превышать 1 миллион, но количество элементов на узел превышает порядок в сотни. Вы можете думать об этом как о большом графике, но о разреженных связях. Меня интересует только добавление краев и печать содержимого графика в терминах каждого ребра. Надеюсь, это ясно. Я просто хотел бы узнать, есть ли более разумные способы сделать это с помощью C++. – Swami
Использование unordered_map обеспечит чрезвычайно быстрый доступ к одноэлементному доступу, но также и последовательный доступ. Если вам нужно распечатать все связанные значения с помощью ключа и всех ключей на карте, я бы пошел на std :: map. В противном случае, если вы только обращаетесь к клавишам сингулярно, переходите к unordered_map. Поскольку вы уже рассматриваете ключи, я не буду говорить о списках смежности/векторах. –