自定义stringbuffer类(C++)

#ifndef TG_STRBUF_H
#define TG_STRBUF_H

#include<iostream>
#include <stdarg.h>
#include<string.h>
#include<vector>

class tg_strbuf
{
public:
    tg_strbuf():tg_strbuf(0)
    {}

    tg_strbuf(uint32_t capacity):_len(0)
    {
        _capacity=capacity;
        if(_capacity<256)
        {
            _capacity=256;
        }

        _buf=new char[_capacity]{0};
    }

    void format(const char*fmt,...)
    {
        clear();
        va_list args;
        va_start(args, fmt);
        int n=vsprintf(_buf + _len,fmt, args);
        _len += n;
        va_end(args);
    }

    void append_format(const char*fmt,...)
    {
        va_list args;
        va_start(args, fmt);
        int n=vsprintf(_buf + _len,fmt, args);
        _len += n;
        va_end(args);
    }

    ///转为16进制字符串
    void to16str(const std::vector<char>& arr)
    {
        if(arr.size())
        {
            to16str( &arr[0], arr.size());
        }
        else
        {
            to16str(nullptr, 0);
        }
    }

    ///转为16进制字符串
    void to16str(const char* data, uint32_t len)
    {
        clear();
        if(len<1)
        {
            return;
        }
        _len = len*3 - 1 ;
        reserve(_len + 1);

        sprintf(_buf, "%02X", static_cast<unsigned char>(*data++));
        char* tmp = _buf+2;

        for(uint32_t i=1; i<len; i++)
        {
            sprintf(tmp, " %02X", static_cast<unsigned char>(*data++));
            tmp+=3;
        }
        *tmp=0;
    }

    tg_strbuf& append(const std::string& str)
    {
        return append(str.c_str(), str.length());
    }

    tg_strbuf& append(const char* str)
    {
        auto len = static_cast<uint32_t>(strlen(str));

        return append(str, len);
    }

    tg_strbuf& append(const char* str, uint32_t n)
    {
        auto len = n+1;
        reserve(_len+len);

        strcpy(_buf+_len, str);
        _len+=len-1;

        return *this;
    }

    void reserve(uint32_t capacity)
    {
        if(capacity > _capacity)
        {
            _capacity = 2*_len > capacity ? 2*_len:capacity;
            auto tmp = new char[_capacity];
            strcpy(tmp, _buf);
            delete [] _buf;
            _buf=tmp;
        }
    }

    const char* c_str()const
    {
        return _buf;
    }

    void clear()
    {
        _len=0;
        *_buf=0;
    }

    uint32_t len() const
    {
        return _len;
    }

    uint32_t capacity()const
    {
        return _capacity;
    }

    tg_strbuf(const tg_strbuf&)=delete;
    tg_strbuf& operator=(const tg_strbuf&)=delete;

    ~tg_strbuf()
    {
        delete [] _buf;
    }

private:
    uint32_t _len;
    uint32_t _capacity;
    char* _buf;
};

#endif // TG_STRBUF_H

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,C字符串是一种以空字符('\0')结尾的字符数组,用于表示字符串。C字符串可以使用字符数组来存储和操作。而StringBufferC++中的一个,它继承自AbstractStringBuilderStringBuffer使用value来表示存储的字符数组,count表示字符串使用的计数。StringBufferStringBuilder最大的区别是StringBuffer可以在多线程场景下使用,因为它内部的大部分方法都加了synchronized锁。然而,在单线程场景下,StringBuffer的效率相对较低,因为存在锁的开销。 在C++中,可以将一个C字符串转换为StringBuffer对象。例如,如果有一个C字符串"abc",可以使用以下代码将其转换为StringBuffer对象: ``` char data[] = {'a', 'b', 'c'}; StringBuffer str = new StringBuffer(data); ``` 这样,字符串"abc"将会存储在StringBuffer对象str中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [[C++] StringBuffer的实现](https://blog.csdn.net/weixin_30892889/article/details/98634996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [一篇与众不同的 StringStringBuilder 和 StringBuffer 详解](https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/106610294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值