1

我正在创建一个哈希表。每个值都是一个字符串。我有决定使用什么结构来存储字符串的问题。我直觉地想到std::stringchar*。但,

1),std::string如果字符串很短,似乎使用堆栈。这意味着如果我的哈希表真的很大,这不是一个好的选择。
2), 如果使用char*then 我不知道如果我想更改一个值要返回什么,例如在以下情况下:myTable[i] = changedString;在这种情况下,我似乎需要实现一个新的字符串类。但我觉得那里没有必要std::string

有人可以提出任何建议/意见吗?谢谢!

4

3 回答 3

1

我假设您正在尝试实现 unordered_map(HW?),这就是您不使用它的原因。

您应该使用 std::vector 或 std::string,但不要使用数组。

为什么 std::string 使用堆栈会出现问题?

于 2013-11-02T14:00:11.163 回答
0

造成的开销std::string很小,实际上 AFAIK 除了指向字符串内部缓冲区的指针之外,只有sizecapacity成员,两者都是 type size_t,导致假设(它取决于环境)每个字符串 8 个字节,所以如果你有一个 100 的数组000 个字符串,会有大约 780KB 的开销,除非您处于具有严格内存限制的环境中,否则我不会担心这一点。

如果字符串的长度是固定的或以最小的方式变化(比如说 2 到 4 个字符),那么使用具有自动存储持续时间的数组可能更合理:

struct X {
    ...
    char code[4]; // up to 4 characters
};

即使以以下方式复制它的实例,它也可以正常工作:

X x1, x2;
...
x2 = x1;

但是,如果您现在没有充分的理由担心这一点,那么您此时所做的任何事情都几乎是过早的优化

于 2013-11-02T14:10:56.693 回答
0

如果您的目标是创建一个哈希表,您应该尝试消除任何会使特定任务变得更加复杂的干扰。因此,您应该将 std::string 用于表中的可变值,这样您就不必花费开发精力来分配和释放 char*

一旦您的哈希表功能正常且正确,如果您有理由迁移到 char*,那么您以后随时可以更改为它。专注于您的最高优先级目标,即哈希表,在达到您的第一个目标之前,不要花时间试图超越 std::string 性能;在任何情况下,击败 std::string 可能都不值得。

于 2013-11-02T14:11:46.883 回答