ohmu
ohmu

Reputation: 19780

How to most efficiently construct a std::string from char * with size

I was looking at a way to achieve sprintf() functionality with std::string and I found a good answer from std::string formatting like sprintf. This is somewhat hacky though because it writes directly to the pointer returned from string.c_str(). So I reimplemented it using a char * with malloc() and 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;
}

I know I could just do:

str = std::string(buffer);

But then it will have to essentially do strlen(buffer). I could make it a little better by:

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

But would using string.swap() be more efficient by swapping the internal buffer instead of copying it?

str.swap(std::string(buffer, size));

Is there a better way to do this?

Upvotes: 7

Views: 6031

Answers (1)

MSalters
MSalters

Reputation: 179981

Just use str.assign(buffer, size);

Upvotes: 17

Related Questions