2011-12-23 75 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