Похоже, вы хотите карту наборов.
std::map< int, std::set< int > >
Так что для int вы можете хранить коллекцию всех своих соседей в наборе. Вам понадобятся функции для управления этой коллекцией.
Если число узлов исчисляемо, то есть они варьируются от 0 до N и включают все эти числа, тогда вы можете использовать std::vector< std::set<int> >
, и это будет более эффективно. Вы также можете использовать std::vector< std::bitset<N> >
или std::vector< boost::dynamic_bitset > >
, если у вас есть, скажем, 20 000 узлов и, следовательно, вы можете предоставить 20 000 наборов битов по 2500 байт (плюс немного служебной информации) каждый = 50 МБ памяти (приблизительно).
Это немного более компактная модель, чем у вас, но не намного. Если у вас есть миллион вершин, это будет около 125 ГБ, поэтому, очевидно, вы не можете использовать эту модель, но должны использовать набор. Кроме того, итерация по вершине, чтобы увидеть ее соседей, - это гораздо более быстрая операция с набором, чем с набором битов.
Если не существует много вершин, в которых вообще нет соседей, и если они последовательно пронумерованы, карта не имеет преимуществ перед вектором.
Не уверен, сколько памяти вы называете "тоннами". Модель, которую я только что описал, использует постоянную память, в то время как карта наборов использует память, пропорциональную количеству отношений соседства, которые у вас есть, но по мере заполнения она будет гораздо менее компактной, чем вектор битовых наборов, поэтому будет потреблять больше.