2014-10-03 93 views
1

比方说,我有char buffer[64]uint32_t lengthbuffer可能会或可能不会为空终止。如果空终止,则缓冲区的其余部分将填充空值。变量length保存缓冲区的长度。将缓冲区或C字符串复制到std :: string中的最快方法

我想将它复制到std::string而不会在字符串对象的末尾出现额外的空值。

本来,我想:

std::string s(buffer, length); 

该副本时,缓冲区填满,并在最后零点额外的空值。

我能想到的:

char buffer2[128]; 
strncpy(buffer2, buffer, 128); 
const std::sring s(buffer2); 

但它是一种浪费,因为它的副本两次。

我想知道是否有更快的方法。我知道我需要进行基准测试,以确切知道哪种方式更快......但我想看看其他一些解决方案,然后进行基准测试......

在此先感谢。

回答

2
  1. 如果可以的话,我只需在缓冲区的末尾添加'\0'和 然后使用string构造函数的C字符串版本。

  2. 如果你不能,你需要确定是否在您的 缓冲区的一个'\0',虽然你在它,你还不如指望你'\0'之前遇到的 字符数。然后,您可以使用 计数与(buffer,length)形式string构造函数:

    #include <string.h> 
    //... 
    std::string s(buffer, strnlen(buffer, length)); 
    
  3. 如果你不能做到1,不想遍历buffer两次(一次确定的长度,一旦在字符串构造函数中),你可以这样做:

    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); 
    } 
    

    我离开基准给你。构造函数的C字符串版本可能会在内部使用类似于strlen的内容,以避免重新分配,因此使用string构造函数的c-string版本可能没有太多好处。

+1

我无法添加 '\ 0' 到端不幸。您的替代解决方案非常棒。谢谢! – Hei 2014-10-03 09:51:09

0

您可以使用所有的规范方法来做到这一点。

比较快的方式是肯定自己smartpointer实现(或使用任何已经完成的std::shared_ptr )。

每个智能指针(sp)指向数组的第一个字符并包含。

每次你做array.copy你不做一个真正的副本,但你只需添加一个引用做该数组。

所以,一个 “复制” 取O(1),而不是O(N)

相关问题