Я никогда не использовал adjacency_list
, поэтому это просто идея , которая работает с контейнерами STL.
То есть с использованием adjacency_list говорит BGL uses containers from the STL such as std::vector, std::list, and std::set to represent the set of vertices and the adjacency structure
. Хорошо, тогда вам просто нужно дать соседнему списку std :: vector, std :: list и std :: set, которые имеют свой собственный тип распределителя. Добавление собственного распределителя в контейнеры STL - простая задача . Сделав все это, вы просто должны получить от своих распределителей размер памяти, который был выделен при заполнении adjacency_list.
Таким образом, идея состоит в том, чтобы создать соседний список из контейнеров STL (что кажется возможным после быстрого просмотра документации BGL), которые имеют собственные типы распределителей.
Обновление 1
На самом деле вы не сказали, почему вам нужно знать, сколько байтов потребляет ваш график. Если вам просто нужно получить этот номер только один раз, вам, вероятно, придется написать свою программу с и без заполнения графика. Затем запустите, например, UNIX95= ps -u $USER -o vsz,args
и выясните разницу. Примерно вы получите размер вашего графика.
Если вам необходимо регулярно получать эти значения в вашем приложении, и если вы не можете реализовать все решение с использованием распределителей, вам нужно начать с нескольких небольших шагов.
- Читайте о распределителях:
C ++ Standard Allocator, Введение и реализация
Распределители (STL)
- Попробуйте реализовать std :: vector с вашим собственным распределителем в качестве упражнения
- Попробуйте добавить счетчики байтов к вашему распределителю
- Попробуйте построить граф Boost с помощью распределителя.
Настройка хранилища списков смежности
- Сделайте что-нибудь для подсчета байтов в элементах std :: string ваших контейнеров. По умолчанию они не будут использовать распределитель своего контейнера. Поэтому либо вместо этого используйте строки фиксированного размера, либо управляйте каким-либо образом, вставьте распределитель контейнера в члены этой строки. Опять же, взгляните на Добавление собственного распределителя в контейнеры STL
Кстати, если вы не хотите заново изобретать распределитель C ++, вы можете просто использовать что-то вроде этого:
template <typename T> class your_allocator {
public:
// here you need to put everything that is required by C++ standard
// and calls finally send to std_allocator_
private:
std::allocator<T> std_allocator_;
};