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

C++ std::string或char[]作为大型数组结构的元素,c++,string,C++,String,我正在创建一个哈希表。每个值都是一个字符串。我的问题是决定使用什么结构来存储字符串。直觉上我想到了std::string和char*。但是, 1) 如果字符串较短,std::string似乎会使用堆栈。这意味着如果我的哈希表真的很大,这不是一个好的选择。 2) ,如果使用char*,则如果要更改值,我不知道返回什么,例如在以下情况下:myTable[I]=changedString在这种情况下,我似乎需要实现一个新的字符串类。但是我觉得在std::string中没有必要这样做 有人能提出建议/意

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

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


有人能提出建议/意见吗?谢谢

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

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


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

我假设您正在尝试实现无序映射(H.W?),这就是为什么不使用它的原因

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


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

std::string
造成的开销很小,实际上除了指向字符串内部缓冲区的指针之外,还有
大小
容量
成员,这两个成员都是
大小
类型的成员,比如说(它与环境有关)每个字符串8个字节,因此如果您有一个100000个字符串的数组,将有大约780KB的开销,这是我不会担心的,除非您在一个内存限制严格的环境中

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

struct X {
    ...
    char code[4]; // up to 4 characters
};
即使以以下方式复制它的实例,它也可以正常工作:

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

但是,如果您现在没有真正好的理由担心这个问题,那么此时您所做的任何事情都几乎是过早的优化

std::string
引起的开销是最小的,实际上除了指向字符串内部缓冲区的指针之外,只有
size
capacity
成员,这两种类型都是
size\u t
,导致每个字符串有8个字节(取决于环境),因此如果您有一个100000个字符串的数组,将有大约780KB的开销,这是我不会担心的,除非你在一个有严格内存限制的环境中

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

struct X {
    ...
    char code[4]; // up to 4 characters
};
即使以以下方式复制它的实例,它也可以正常工作:

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

然而,如果您现在没有真正好的理由担心这个问题,那么此时您所做的任何事情都是过早的优化。如果您的目标是创建一个哈希表,那么您应该尝试消除任何会使特定任务更加复杂的干扰。因此,您应该对表中的可变值使用std::string,这样您就不必花费开发精力来分配和释放字符*


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

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


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

“如果字符串很短,std::string似乎会使用堆栈”。如果要将它们存储在无序的映射中,它应该如何使用堆栈?我会说,坚持使用string,直到您确认它有任何问题为止。嗯,我正在实现我自己的哈希表。但也许我现在会坚持使用std::string。谢谢~两个都不用。而是使用一个模板参数,让表pass的用户使用任何字符串类“std::string似乎在字符串较短时使用堆栈”。如果要将它们存储在无序的映射中,它应该如何使用堆栈?我会说,坚持使用string,直到您确认它有任何问题为止。嗯,我正在实现我自己的哈希表。但也许我现在会坚持使用std::string。谢谢~两个都不用。取而代之的是使用一个模板参数,让表pass的用户使用任何字符串classI,我认为他的意思是“短字符串优化”。其中一个stdlib实现静态地为短字符串分配19个字符的数组。我想这是因为我没有太多的经验判断如何安排记忆。因为我学到了“堆栈大小有限,用于临时变量”,所以我有点想把它留给基于局部小值的变量,并使用堆设计我的大多数复杂结构。不知道如何决定什么更好/必要。@flyinggip您不应该关心这个问题,您正在谈论的是运行时堆栈。ADT堆栈的大小不受限制,例如