我正在创建一个哈希表。每个值都是一个字符串。我有一个问题,决定使用什么结构来存储字符串。直觉上我想到了std::string
和char*
。但是,
1),如果字符串很短,std::string
似乎使用堆栈。这意味着如果我的哈希表真的很大,这不是一个好的选择
2),如果使用char*
,那么如果我想更改一个值,我不知道该返回什么,例如,在以下情况中:myTable[i] = changedString;
在这种情况下我似乎需要实现一个新的字符串类。但我觉得那里std::string
没有必要。
有人可以提出任何建议/意见吗?谢谢!
答案 0 :(得分:1)
我假设您正在尝试实现unordered_map(H.W?),这就是您不使用它的原因。
你应该使用std :: vector或std :: string,但不要使用数组。
为什么使用堆栈存在std :: string的问题?
答案 1 :(得分:0)
由std::string
引起的开销很小,实际上AFAIK除了指向字符串内部缓冲区的指针外,只有size
和capacity
成员,都是类型{{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可能都不值得。