Sto cercando di imparare C ++ e provare a scrivere un codice per una tabella hash semplice come la seguente struttura:
array[0][0] array[0][1] array[0][2]
key 1 value 1 value 2
array[1][0] array[1][1]
key 2 value 3
array[2][0] array[2][1] array[2][2]
key 3 value 4 value 5
significa Array of Dynamic Arrays. Ora, sotto c'è il mio codice:
#include<iostream>
#include<conio.h>
using namespace std;
int ele [10] ;
int** arrays = new int*[10] ;
class HashTable
{
public:
HashTable()
{
for(int i = 0 ; i < 10 ; i++)
ele[i] = - 1 ; // element array stores the number of elements in column of each row
}
void put(int key, int value){
if(ele[key] == -1){
arrays[key] = new int[1];
arrays[key][0] = value ; // initialize 2nd dimention
ele[key] = 0 ;
}
else{
int num = ele[key] ;
int temp[num + 1] ;
for(int i = 0 ; i < num ; i++)
temp [i] = arrays[key][i] ;
temp[num+1] = value ;
arrays[key] = new int[num + 1] ;
for(int i = 0 ; i < num+1 ; i++) // take all the elements in an temporary array and store it back
arrays[key][i] = temp [i] ;
ele[key] = num + 1 ;
}
}
};
main()
{
HashTable object;
object.put(0 , 100);
object.put(1 , 200);
object.put(3 , 300);
object.put(3 , 3000);
object.put(3 , 30000);
object.put(5 , 500);
object.put(5 , 5000);
object.put(5 , 50000);
object.put(5 , 50);
for (int i = 0 ; i < 10 ; i++ ){
int j = ele[i] ;
cout << j << " K ";
if(j != -1){
for (int k = -1 ; k < j ; k++ ) // print the values of corresponding keys
cout << arrays[i][k] << " ";
}
}
getch();
return 0;
}
che usa il metodo put per inserire valori nella HashTable personalizzata.
Qualcuno può aiutarmi perché il codice precedente fornisce un valore di output errato durante il tentativo di recuperare i valori della chiave corrispondente.
risposte:
2 per risposta № 1Questo non può funzionare:
for (int k = -1 ; k < j ; k++ )
cout << arrays[i][k] << " ";
Non puoi avere array con indici negativi. Quando entri nel ciclo, lo hai k = -1
quindi provi ad accedere arrays[i][-1]
, che non ha funzionato.
Altre raccomandazioni:
- Gli oggetti
arrays
eele
dovrebbe essere membri della tua classe ed essere dichiarato al suo interno (come membri privati) - Sulla linea in cui scrivi
arrays[key] = new int[num + 1]
, ti sei dimenticato di chiamaredelete
sull'oggetto precedente. Ciò causerà a perdita di memoria. - Dovresti stampare il tuo
arrays
usando un metodo all'interno della tua funzione (come ilput
metodo) e quindi basta chiamarlo usandoobject.print()
(se lo hai chiamatoprint
) - analisi
if(j != -1)
prima del ciclofor (int k = -1; k < j; k++)
è ridondante: sej == -1
comunque non entrerai mai nel ciclo.