如何从char*中最有效地构造一个带有size的std :: string

use*_*450 2 c++ std stdstring

我正在寻找一种实现sprintf()功能的方法std::string,我从std :: string格式如sprintf找到了一个很好的答案.这有点不好看,因为它直接写入从返回的指针string.c_str().所以我使用char *with malloc()realloc().重新实现它.

std::string string_format(const char * format, ...) {
    size_t size;
    size_t n;
    va_list args;
    char * buffer;
    std::string str;

    size = 100;
    buffer = malloc(size);
    for (;;) {
        va_start(args, format);
        n = vsnprintf(buffer, size, format, args);
        va_end(args);
        if (n > -1) {
            if (n < size) {
                size = n;
                break;
            }
            size = n + 1;
        } else {
            size *= 2;
        }
        buffer = realloc(buffer, size);
    }

    str = std::string(buffer, size);

    free(buffer);
    return str;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

str = std::string(buffer);
Run Code Online (Sandbox Code Playgroud)

但它必须基本上做到strlen(buffer).我可以通过以下方式改善它:

str = std::string(buffer, size);
Run Code Online (Sandbox Code Playgroud)

但是string.swap()通过交换内部缓冲区而不是复制它会更有效吗?

str.swap(std::string(buffer, size));
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

MSa*_*ers 9

只是用 str.assign(buffer, size);