2014-10-03 2 views
1

char buffer[64]uint32_t length이 있고 buffer이 null로 끝나는 수도 있고 그렇지 않을 수도 있습니다. 널 종료 (null)로 끝나면 나머지 버퍼는 널 (NULL)로 채워집니다. length 변수는 버퍼의 길이를 보유합니다.버퍼 또는 C 문자열을 std :: string으로 복사하는 가장 빠른 방법

std::string 문자열 개체 끝에 추가 null없이 복사하고 싶습니다.

원래 I 시도 :

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' 전에 발생 문자의 수를 계산 할 수 있는지 확인 할 필요가없는 경우

    . 당신이 1을 할 수없는 이상 buffer 두 번 (한 번 반복하지 않으려면 한 번, 길이를 결정하기 위해

    #include <string.h> 
    //... 
    std::string s(buffer, strnlen(buffer, length)); 
    
  3. : 그런 다음 string 생성자의 (buffer,length) 양식이 수를 사용할 수 있습니다 문자열 생성자에서 다음을 수행 할 수 있습니다.

    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 생성자를 사용하면 얻을 수있는 이점이 많지 않을 수 있습니다.

+1

나는 불행하게도 마지막에 '\ 0'을 추가 할 수 없습니다 걸릴. 귀하의 대안 솔루션은 훌륭합니다. 감사! – Hei

0

모든 표준 방법을 사용하여이를 수행 할 수 있습니다.

빠른 방법은 반드시 자신 smartpointer에 의해 구현 (또는 이미 std::shared_ptr 으로 수행 아무것도 사용)입니다.

각 스마트 포인터 (sp)는 array의 첫 번째 문자를 가리키며 포함합니다.

array.copy를 수행 할 때마다 실제 복사본을 만들지는 않지만 단순히 해당 배열을 참조로 추가하면됩니다.

그래서는 "복사"O (1) 대신 O의 (N)

관련 문제