Я просматриваю массив чисел (0-9) и хочу сохранить это вхождение в хэш-таблицу.
int ar[size] = {0,2,0,1,4,6,8 ........ 8,6,7}; // array
auto hash=new int[10]; //here the value is initialized to zero
for(int i=0;i<size;i++)
{
//here i want to store the time a number occurred in the array with
keys as number itself
hash[ar[i]] = **valueof(hash[ar[i]])+1** // i want to do this
}
Редактировать
auto hash=new int[10]();
Вы пытались сделать это: hash[ar[i]] = hash[ar[i]] + 1;
?
После этого вы ожидаете, что поиск по valueof(hash[ar[i]])+1
найдет что-нибудь в таблице? Если вы измените значение после того, как ваш хэш исходного значения создал ключ, то поиск нового значения больше не будет хешировать правильный ключ.
Вы можете увеличить значение на месте:
hash[ar[i]]++;
Также:
// Not true:
auto hash=new int[10]; //here the value is initialized to zero
Вы должны добавить инициализатор:
auto hash=new int[10](); //here the value is initialized to zero
Ссылка:
If type is an array type, an array of objects is initialized.
- If initializer is absent, each element is default-initialized
- If initializer is an empty pair of parentheses, each element is value-initialized.
https://en.cppreference.com/w/cpp/language/новый
Кроме того, выделение кучи на самом деле не требуется, вы можете просто использовать int hash[10] = {0}
или std::array<int, 10> hash; hash.fill(0)
.
Это -
в инициализации массива какой-то трюк, с которым я не знаком, или опечатка?
Вы можете использовать следующую строку кода:
hash[ar[i]] += 1
Оператор нижнего индекса возвращает значение ссылка, так что вы можете просто увеличить его!
++hash[ar[i]];
- также есть ли причина, по которой вам нужноhash
быть динамически распределенным? Вероятно, было бы проще использоватьstd::array
или, возможно,std::vector
, если размер может меняться.