0

私は C++ を学習しようとしており、次の構造のような単純なハッシュ テーブルのコードを記述しようとしています。

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

動的配列の配列を意味します。さて、以下は私のコードです:

#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;
}

put メソッドを使用して、カスタム HashTable に値を入力します。

対応するキーの値を取得しようとしているときに、上記のコードが間違った出力値を返す理由を誰か助けてもらえますか?

4

1 に答える 1

2

これは機能しません:

for (int k = -1 ; k < j ; k++ )
    cout << arrays[i][k] << "  ";

負のインデックスを持つ配列を持つことはできません。ループに入ると、k = -1にアクセスしようとしますarrays[i][-1]が、うまくいきません。

その他の推奨事項:

  • オブジェクトarraysとクラスのメンバーであり、その内部で (プライベート メンバーとして) 宣言するele必要があります。
  • を書いている行で、前のオブジェクトarrays[key] = new int[num + 1]を呼び出すのを忘れてdeleteいます。これにより、メモリ リークが発生します。
  • arrays関数内でメソッドを使用して(メソッドのように)印刷し、putそれを使用して呼び出すobject.print()必要があります(名前を付けた場合print
  • if(j != -1)ループ前のテストfor (int k = -1; k < j; k++)は冗長です:j == -1とにかくループに入らない場合。
于 2012-11-08T13:50:05.010 に答える