std :: string或char []作为大型数组结构的元素

时间:2013-11-02 13:49:05

标签: c++ string

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

为什么使用堆栈存在std :: string的问题?

答案 1 :(得分:0)

std::string引起的开销很小,实际上AFAIK除了指向字符串内部缓冲区的指针外,只有sizecapacity成员,都是类型{{1}导致让我们说(它依赖于环境)每个字符串8个字节,所以如果你有一个10万个字符串的数组,那么开销大约为780KB,除非你在一个严格的环境中,否则我不会担心这个问题。记忆限制。

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

size_t

即使在以下列方式复制实例时也能正常工作:

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

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

答案 2 :(得分:0)

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

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