假设我有char buffer[64]
和uint32_t length
,buffer
可能会或可能不会被终止。如果它以null结尾,则缓冲区的其余部分将填充空值。 length
变量保存缓冲区的长度。
我想将它复制到std::string
,而不会在字符串对象的末尾添加额外的空值。
最初,我试过了:
std::string s(buffer, length);
当缓冲区在末尾填充空值时复制额外的空值。
我能想到:
char buffer2[128];
strncpy(buffer2, buffer, 128);
const std::sring s(buffer2);
但它有点浪费,因为它会复制两次。
我想知道是否有更快的方法。我知道我需要进行基准测试才能确切地知道哪种方式更快......但我想看看其他一些解决方案然后进行基准测试...
提前致谢。
答案 0 :(得分:2)
如果可以,我只需在缓冲区的末尾添加'\0'
即可
然后使用string
构造函数的c-string版本。
如果你不能,你需要确定你的'\0'
是否有'\0'
缓冲区,当你在它的时候,你也可以计算它的数量
在(buffer,length)
之前遇到的字符。然后你可以使用它
使用string
构造函数的#include <string.h>
//...
std::string s(buffer, strnlen(buffer, length));
形式计算:
buffer
如果你不能做1.并且不想迭代char last_char = buffer[length-1];
buffer[length-1] = '\0';
std::string s(buffer); //the c-string form since we're sure there's a '\0' in the buffer now
if(last_char!='\0' && s.length()==(length-1)) {
//With good buffer sizes, this might not need to cause reallocation of the strings internal buffer
s.push_back(last_char);
}
两次(一次确定长度,一次在字符串构造函数中),你可以这样做:
strlen
我将基准测试留给您。无论如何,构造函数的c-string版本可能在内部使用类似c-string
的内容来避免重新分配,因此使用string
构造函数的{{1}}版本可能无法获得太多好处。
答案 1 :(得分:0)
您可以使用所有规范方式来执行此操作。
更快的方法肯定是由您自己实施 smartpointer (或使用已经完成的任何事情std::shared_ptr )。
每个smartpointer(sp)指向数组的第一个char并包含。
每次执行array.copy时,你都不会做一个真正的副本,但你只需要添加一个引用来做那个数组。
所以,#34;副本&#34;取O(1)而不是O(N)