Как да намерите размера на хеш таблицата?

Имам хеш таблица, дефинирана по този начин

typedef std::unordered_map<unsigned long long int,unsigned long long int> table_map;

и в програмата чета съдържанието на файла в буфер, използвайки fread като този:

fread(buffer, sizeof(long long int), 1024, file1);

Декларирам хеш-таблицата като

table_map c1;

Сега създавам хеш таблица като

for (i = 0; i < 1024; i++)
    c1.insert(table_map::value_type(buffer[i], i));

Сега въпросът ми е след цикъла for как мога да получа размера на хеш-таблицата?

Има 1024 елемента от тип unsigned long long int, а също и ключове от същия тип, но не можах да използвам sizeof(Mymap) или `size of(c1), защото просто връща стойността 32. Има ли някакъв начин да го намеря?

Благодаря, Сунил


person 0x0    schedule 25.08.2010    source източник


Отговори (2)


Умножете свойството за размер на контейнера по размера на двойка:

std::cout << c1.size() * sizeof(table_map::value_type) << "\n";

В моята система това се отпечатва:

16384

Това не е напълно точно, тъй като счетоводните данни не са отчетени. Не можете да го отчетете, защото (доколкото знам) стандартът няма никакви гаранции за тази подробност на изпълнението.

Може да получите малко по-добри данни, ако прегледате данните от кофата. ::кофа, :: брой_кофа, ::размер_кофа. Това обаче може да ви даде само данни за ключове, стойности и двойки. Не съм пробвала.

person Merlyn Morgan-Graham    schedule 25.08.2010

Всички стандартни библиотечни контейнери имат size() членска функция, която връща броя на елементите в контейнера.

Можете просто да се обадите на c1.size().

person James McNellis    schedule 25.08.2010
comment
Работи перфектно. Но как да го свържа с общия размер? Искам да кажа, че размерът на хеш-таблицата включва броя на елементите (в моя случай всеки елемент е unsigned long long int) и размера на ключа (който също е unsigned long long int), нали? - person 0x0; 25.08.2010
comment
@Sunil: Ако искате размера в байтове, тогава няма преносим начин да получите тази информация. - person James McNellis; 25.08.2010
comment
Сунил: Бихте ли имали повече късмет, ако използвате персонализиран разпределител? Изглежда разпределителят е само за двойки, а не за динамично разпределените счетоводни данни. Това все пак изглежда нарушава някои сценарии, които иначе биха могли да бъдат обработени с персонализиран разпределител. - person Merlyn Morgan-Graham; 25.08.2010
comment
@ merlyn Morgan-Graham: Персонализиран разпределител за хеш таблица? Използвал съм персонализирани разпределители като вектори вместо масиви, но не съм използвал нищо по отношение на хеш таблицата, защото съм нов в C++. Можете ли да хвърлите повече светлина върху него или да споделите някаква връзка, където мога да науча какво предлагате? Благодаря. - person 0x0; 25.08.2010
comment
@Sunil: За да получите размера на съдържанието му в байтове, умножете c1.size() * sizeof( table_map::value_type ). Това обаче не представлява общото натоварване на паметта. - person Potatoswatter; 25.08.2010