2011-12-23 11 views
2

少しのコンテキスト:私は非常に単純なハッシング関数/ハッシュテーブルをdescribed hereとして作ろうとしています。私は基本的に最初のステップにあります。盲目的には、それが始まる手紙に基づいて配列にキーを追加します(スペースがまだ占有されていないかチェックしません)。私はこれまでのところ、これを行うために使用しているコード:文字列配列(chars)のC++要素はソース文字列に依存します

int main(int argc, char **argv) { 
    char *arrayKeys[300]; 
    std::string aName("Charles"); 

    char *aNameCpy = new char[aName.size() + 1]; 
    std::copy(aName.begin(), aName.end(), aNameCpy); 
    aNameCpy[aName.size()] = '\0'; 

    int kPos = storeKey(arrayKeys, aNameCpy); 

    std::cout << "The new position in arrayKeys for 'Charles' is: " << 
     kPos << "\ncontaining the text: " << arrayKeys[kPos] << std::endl; 
    delete[] aNameCpy; 
    return 0; 
} 

int storeKey(char **keys, char *key) { 

    int charLett = -1; 
    charLett = (int)key[0]; 
    if(charLett != -1) 
     charLett = charLett - 65; 

    keys[charLett * 10] = key; 

    return charLett*10; 
} 

私の質問は、私はそれが完全に離れて配列のではなく、オリジナルの際に依存している配列(arrayKeys)に文字列を追加する方法、です文字列?配列キーを出力する前に文字列(aNamCpy)のコピーを削除すると、配列キーが文字化けして記号化されます。私はarrayKeys配列に追加する非const文字列が必要です(変更できるように)ため、文字列を関数に送る前にコピーしています。見た文字列のメソッドはconstを返すようです。

は(私が試みたこれの別のバージョンが found hereすることができますが、私はむしろ、そのようなarrayKeys初期化しないだろう - 明確な二次元(列)の長さを持つ)
C++はまだ私には非常に新しいですので、私はできません文字列をarrayKeysにコピーして非const部分をどうやってやりとりするかを理解する。どんな助けも非常に高く評価されるでしょう。

+3

この場合、char *を使用せず、std :: string(および配列のstd :: vector)を使用してください。 – Mark

+0

std :: vectorを使用していませんが、ありがとう。 – Chase

答えて

2

最近のC++構文を使用するようにコードを変更する方法は次のとおりです。私はあなたがこの方法を使いやすくなると思います。

int storeKey(vector<string> &keys, const string &key) { 
    int charLett = -1; 

    if (!key.empty()) { // you weren't doing this before! 
     charLett = key[0]; 
     charLett = toupper(charLett) - 'A'; 
     keys[charLett * 10] = key; 
    } 

    return charLett*10; 
} 

int main() { 
    vector<string> arrayKeys(300); 
    std::string aName("Charles"); 

    // No need to bother with the awkward copying. 
    // std::vector and std::string will take care of it for us. 

    int kPos = storeKey(arrayKeys, aName); 

    if (kPos >= 0) { 
     cout << "The new position in arrayKeys for 'Charles' is: " << 
      kPos << "\ncontaining the text: " << arrayKeys[kPos] << endl; 
    } 

    // Don't have to remember to delete anything because nothing was new'ed. 
    return 0; 
} 
+0

この例ではおかげさしです。簡単な質問ですが、文字列aNameを再利用すると問題は発生しますか?それとも毎回新しいものを作るべきですか? – Chase

+0

再割り当てすると、その特定の文字列オブジェクトを上書きしますが、ベクトルの要素は安全です。それらはすべてコピーです。 –

1

は(@Kristoが正しい考えを持っている。私は尋ねたとして、質問にコメントを追加するつもりです。)

基本的には、aNameCpyを削除しないでください。コピーを有効にする必要があるため、削除しないでください。ハッシュ全体を削除する場合に限り、文字列を削除する必要があります。

C++は、私が 非const一部に

を両立する方法を見つけ出すことはできませんので、あなたがconst char **keysconst char *keyするkeyskeyの両方を宣言する可能性がまだ私に非常に新しいです。 keysはcharへのポインタへのポインタです。より正確には、の非コンテナポインタconst charへのポインタです。つまり、keysを変更することはできますが、(間接的に)それが指す実際の文字を変更することはできません。

だから、単にそれに応じてstoreKey int storeKey(const char **keys, const char *key)の宣言と更新arrayKeysにconstを入れconst char *arrayKeys[300];

最後にひとつのスタイルの問題:あなたはしないメインに、storeKey内の文字列をコピーする必要があります。これは、storeKeyがコピーを所有していることを読者に明示するので、より良いデザインです。

int storeKey(char **keys, const char *key) { 
    char * the_copy = new char[strlen(key)+1]; 
    strcpy(the_copy, key); 

...とそうでも、できれば短いで、代わりにこのすべてのC++ stringを使用!

+0

ヒントをありがとう、私はベクトルと文字列のメソッドを試してみるつもりだと思うが、それはとにかく知って良いです。 – Chase