2011-12-23 74 views
2

一個小上下文:我試圖做一個非常簡單的哈希函數/哈希表爲described here。我基本上是第一步,根據它開頭的字母盲目地向數組添加一個鍵(不檢查空間是否被佔用)。我正在使用的代碼來做到這一點至今:字符串數組(字符串)的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),則數組鍵會變成亂碼。我在將字符串發送給函數之前複製該字符串,因爲我需要一個非const字符串添加到arrayKeys數組(因此可以修改它),並且我查看的任何字符串方法似乎都會返回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部分

你可以同時聲明keyskeyconst char **keysconst char *key。鍵是指針指向字符的指針。更確切地說,它是指向nonconst指針const char。換句話說,你可以修改keys,你不能修改它指向(間接)在的實際字符。

所以,簡單地說const你storeKey int storeKey(const char **keys, const char *key)的申報和更新arrayKeys相應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