一点上下文:我正在尝试将一个非常简单的散列函数/散列表作为described here。我基本上是第一步,根据它开头的字母盲目地向数组添加一个键(不检查空间是否被占用)。到目前为止我用来执行此操作的代码:
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部分。非常感谢任何帮助。
答案 0 :(得分: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;
}
答案 1 :(得分:1)
(@ Kristo有正确的想法。我只是想问一下这个问题的评论。)
基本上,不要删除aNameCpy。您需要副本提醒有效,因此不应删除它。您应该只在删除整个哈希时删除字符串。
C ++对我来说还是一个新手,所以我无法弄清楚如何兼顾它 非常数部分
您可以将keys
和key
声明为const char **keys
,const char *key
。 keys是指向char的指针。更确切地说,它是 nonconst指针指向 const char 的指针。换句话说,您可以修改keys
,您无法修改它(间接)指向的实际字符。
因此,只需将const
放入storeKey int storeKey(const char **keys, const char *key)
的声明中,然后相应地更新arrayKeys const char *arrayKeys[300];
最后一个样式问题:你应该在storeKey
内复制字符串,而不是在main中。这是更好的设计,因为它向读者表明storeKey“拥有”副本。
int storeKey(char **keys, const char *key) {
char * the_copy = new char[strlen(key)+1];
strcpy(the_copy, key);
......等等
但是,简而言之,如果可以,请使用C ++ string
代替所有这些!