十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
string底層實(shí)現(xiàn),參考了網(wǎng)上的一些代碼,注釋都寫在代碼里了,比較清楚。供大家參考交流
#pragma once
#includeclass MyString
{public:
typedef char* iterator;//定義一下迭代器類型,顯得正式一點(diǎn)
typedef const char* const_iterator;
private:
char* _str;
size_t _size;//大小
size_t _capacity;//容量
public:
static char* MyStrcpy(char* dst, const char* src);
MyString(const char* str = "");
MyString(const MyString& str);
~MyString();
iterator begin();
const_iterator cbegin() const;
iterator end();
const_iterator cend() const;
size_t size() const;
size_t capacity() const;
char* c_str() const;
MyString& insert(size_t pos, char c);
MyString& insert(size_t pos, const char* str);
void push_back(const char c);
MyString& append(const char* str);
MyString& erase(size_t pos, size_t len=-1);
void reserve(size_t n = 0);
void resize(size_t n, char c = '\0');
size_t find(char c, size_t pos = 0) const;
size_t find(const char* str, size_t pos = 0) const;
MyString& operator+=(const char c);
MyString& operator+=(const char* str);
char& operator[](size_t pos);
};
#include "MyString.h"
//字符串復(fù)制函數(shù),靜態(tài)方法
char* MyString::MyStrcpy(char* dst, const char* src)
{if (dst == nullptr || src == nullptr || dst == src)
return dst;
while (*src != '\0')
{*dst = *src;
dst++;
src++;
}
*dst = '\0';
return dst;
}
//構(gòu)造函數(shù)
MyString::MyString(const char* str) :_size(strlen(str))
{_capacity = _size;
_str = new char[_capacity + 1];//多一個(gè)是用來存'\0'的,之前的strlen()不會(huì)把'\0'算進(jìn)去
MyStrcpy(_str, str);
}
//拷貝構(gòu)造函數(shù)
MyString::MyString(const MyString& str)
{char* temp = new char[str._capacity + 1];
MyStrcpy(temp, str._str);
_str = temp;
_size = str._size;
_capacity = str._capacity;
}
//析構(gòu)函數(shù)
MyString::~MyString()
{if (_str)
{delete[] _str;
_size =0;
_capacity = 0;
}
}
MyString::iterator MyString::begin()
{return _str;
}
MyString::const_iterator MyString::cbegin() const
{return _str;
}
MyString::iterator MyString::end()
{return _str + _size;
}
MyString::const_iterator MyString::cend() const
{return _str + _size;
}
size_t MyString::size() const
{return _size;
}
size_t MyString::capacity() const
{return _capacity;
}
char* MyString::c_str() const
{return _str;
}
//擴(kuò)容函數(shù)
void MyString::reserve(size_t n)
{//n大于現(xiàn)有容量的時(shí)候,會(huì)申請擴(kuò)容,然后把之前的內(nèi)容復(fù)制過去。否則什么都不做
if (n >_capacity)
{char* temp = new char[n+1];
MyStrcpy(temp, _str);
delete[] _str;
_str = temp;
_capacity = n;
}
}
//插入字符
MyString& MyString::insert(size_t pos, char c)
{//無法插入,直接返回
if (pos >_size)
return *this;
//如果此時(shí)存的字符串已經(jīng)裝滿了,需要先兩倍擴(kuò)容一下
if (_size == _capacity)
{size_t newcap = _capacity == 0 ? 4 : 2 * _capacity;
reserve(newcap);
}
//找到要插入的地方插入字符
//因?yàn)開capacity 若不夠的話,此時(shí)已經(jīng)擴(kuò)容了,所以_str[it]是不會(huì)越界的
size_t it = _size + 1;
while (it != pos)
{_str[it] = _str[it - 1];
it--;
}
_str[pos] = c;
_size++;
return *this;
}
//插入字符串
MyString& MyString::insert(size_t pos, const char* str)
{//無法插入,直接返回
if (pos >_size)
return *this;
//驗(yàn)證是否要擴(kuò)容
size_t len = strlen(str);
reserve(_size + len);
//找到并且插入字符串
size_t it = _size + len;
while (it - pos >len - 1)
{_str[it] = _str[it - len];
it--;
}
for (size_t i = 0; i< len; i++)
{_str[pos] = str[i];
pos++;
}
_size = _size + len;
return *this;
}
void MyString::push_back(const char c)
{insert(_size, c);
}
MyString& MyString::append(const char* str)
{insert(_size, str);
return *this;
}
MyString& MyString::erase(size_t pos, size_t len)
{//-1是默認(rèn)值,代表全部刪除
if (len == -1 || len >= _size - pos)
{_str[pos] = '\0';
_size = pos;
}
else
{for (size_t i = pos + len; i<= _size; i++)
{ _str[i - len] = _str[i];
}
_size = _size - len;
}
return *this;
}
void MyString::resize(size_t n, char c)
{reserve(n);
if (n >= _size)
{memset(_str + _size, c, n - _size);
_size = n;
_str[_size] = '\0';
}
else
{_str[n] = '\0';
_size = n;
}
}
size_t MyString::find(char c, size_t pos) const
{while (pos< _size)
{if (_str[pos] == c)
return pos;
pos++;
}
return -1;
}
size_t MyString::find(const char* str, size_t pos) const
{const char* p = strstr(_str + pos, str);
if (p == nullptr)
return -1;
return p - _str;
}
MyString& MyString::operator+=(const char c)
{insert(_size, c);
return *this;
}
MyString& MyString::operator+=(const char* str)
{insert(_size, str);
return *this;
}
char& MyString::operator[](size_t pos)
{return _str[pos];
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧