从最多X个字符构造std :: string,停止在null char

Fel*_*bek 6 c++ stdstring c++03

我正在从文件中的结构中读取字符串,其中每个字符串具有固定长度,带有'\0'填充.如果存储的字符串需要整个长度,则它们不会以零终止.

我正在构建std::string像这样的人:

// char MyString[1000];
std::string stdmystring(MyString, ARRAYSIZE(MyString));
Run Code Online (Sandbox Code Playgroud)

但是,这也会复制填充.我现在可以修剪弦乐,但是有一种优雅而快速的方法来防止复制吗?

速度比空间更重要,因为它在一个循环中运行.

Use*_*ess 2

简单的解决方案是:

  1. 先计算出正确的长度

    • strnlen要么按照 Dieter 建议使用
    • 或者std::find(MyString,MyString+ARRAYSIZE(MyString),'\0')哪个输入法不慢

    请注意,如果您的字符串适合缓存,那么这可能会主导额外的循环成本

  2. 保留最大字符串大小(您确实说过空间不太重要),并编写一个循环附加字符,直到耗尽宽度或达到 nul (例如copy_until

  3. 实际上创建一个用 nul 初始化的最大大小字符串,如果您希望大小正确,则strncpy可以选择删除nulunused

第二个选项仅使用一个循环,而第三个选项理论上使用两个循环(它在字符串构造函数中,然后在副本中)。然而,push_back每个角色的 似乎比简单的角色分配更昂贵,所以如果#3 实际上更快,我不会感到惊讶。简介并查看!