【发布时间】:2015-02-01 14:43:38
【问题描述】:
我很想知道字符串类如何实现从字符数组复制以初始化其内容。
我的猜测是这样的:
1:查找字符数组的长度,N。(这是怎么做的?一种粗略的方法是单独查看每个字符,直到找到空字符?使用更好的方法吗?)
2:分配N字节的存储空间。
3:使用strcpy逐字节复制每个元素。
显然这不是一个非常复杂的问题,我只是想知道以下是否(基本上或近似)等效:
std::string program_name(argv[0]);
和
std::string program_name;
int length = 0;
while(*(argv[0] + length) != '/0')
++ length;
++ length; // Depends on whether string contains the null character - usually I don't think it does?
program_name.resize(length); // Maybe use reserve instead?
std::cpy(program_name.data(), argv[0], length - 1); // Don't copy the null character at the end
反正就是这样。我没有尝试编译上面的伪代码,因为我对方法的概念感兴趣,而不是对如何完成此操作的细节感兴趣。
【问题讨论】:
-
std::string的实现在 C++ 编译器附带的头文件中可用。使用来源,卢克。剧透警告:这几乎是你想象的方式,真的没有什么聪明的事情发生。 -
您的步骤在语义上是等效的,但不会像优化的标准库实现那样高效。您的手动循环将比
strlen慢得多,并且调整大小不必要地初始化缓冲区只是为了立即再次覆盖它。 -
扩展伊戈尔的评论,不可能有任何聪明的事情发生。 c 风格的字符串定义为以 NUL 字符结尾的连续字符数组。它不保留专用的长度字段。要回答您关于
std::basic_string是否存储零终止符的问题:由于需要在 O(1) 中返回c_str(),因此存储零终止符几乎是强制性的。 -
您的解决方案在概念上类似,但错误:“修改通过数据访问的字符数组是未定义的行为。”