?個人主頁:?熬夜學編程的小林
💗系列專欄:?【C語言詳解】?【數據結構詳解】【C++詳解】
目錄
1、修改操作
2、迭代器操作
3、字符串操作?
4、非成員函數重載操作
總結
1、修改操作
1、string& operator+= (const char* s);
//尾部插入字符串s
2、string& operator+= (char c);//尾部插入字符c
3、void push_back (char c);//尾部插入字符c
4、string& append (const char* s);//尾部插入(追加)字符串s
5、void insert(size_t pos, char ch);//在pos位置插入字符c
6、void insert(size_t pos, const char* str);//在pos位置插入字符串str
7、void erase(size_t pos, size_t len = npos);//從pos位置刪除n個字符
8、void swap(string& s);//把字符串數據進行交換
void push_back(char c)
{// 擴容 容量為0則固定為4 其他則*2if (_size == _capacity){reserve(_capacity == 0 ? 4 : 2 * _capacity);}_str[_size] = c;//_size下標插入字符c++_size;//將大小+1_str[_size] = '\0';//字符串最后位置給標志結束的\0
}
void append(const char* s)
{//追加字符串首先得判斷空間是否足夠size_t len = strlen(s);if (len > _capacity - _size)//空間不夠則擴容{reserve(_size + len);//大小為原大小+插入字符串長度}strcpy(_str + _size, s);//將要追加的數據拷貝到原數據尾_size += len;//更新字符串大小
}
string& operator+=(char c)
{push_back(c);//調用尾插字符函數return *this;
}
string& operator+=(const char* str)
{append(str);return *this;
}
void insert(size_t pos, char ch)
{assert(pos <= _size);//斷言,小于字符串大小才能進行插入操作// 擴容if (_size == _capacity){reserve(_capacity == 0 ? 4 : 2 * _capacity);}// end=_size會有無符號與有符號比較問題,因為pos恒大于等于0,end回到-1// 無符號與有符號比較 會提升至無符號比較 即end = -1 還會大于possize_t end = _size + 1;while (end > pos)//end==pos則循環停止{_str[end] = _str[end - 1];//將前面的元素往后面一個位置移動--end;}_str[pos] = ch;//pos位置賦值字符ch++_size;//更新大小
}void insert(size_t pos, const char* str)
{assert(pos <= _size);//pos小于字符串大小才能進行插入操作size_t len = strlen(str);if (len > _capacity - _size)//容量不夠則擴容{reserve(_size + len);}size_t end = _size + len;while (end > pos + len - 1){_str[end] = _str[end - len];//將原數據向后移動len位置--end;}strncpy(_str + pos, str, len);//不需要拷貝\0因此使用strncpy拷貝len長度到原串_size += len;//更新大小
}
void erase(size_t pos, size_t len = npos)
{assert(pos < _size);if (len == npos || len >= _size - pos)//長度為npos或者大于等于字符串大小-pos即刪除整個字符串{_str[pos] = '\0';//直接在pos位置給\0即可_size = pos;//pos為\0下標,剛還為字符串大小}else//將pos+len位置后的數據拷貝到pos為止{strcpy(_str + pos, _str + pos + len);_size -= len;//更新長度}
}
void swap(string& s)//交換類的成員變量即可,
{std::swap(_str, s._str);//調用庫函數的swap模板函數std::swap(_size, s._size);std::swap(_capacity, s._capacity);
}
2、迭代器操作
注意:暫時我們理解的迭代器實質為指針,但不完全是指針,此處就通過指針來模擬實現。
typedef char* iterator;//將迭代器定義成char*類型
typedef const char* const_iterator;將迭代器定義成const char*類型
1、const char* begin() const;//獲取指向首元素的const迭代器
2、const char* end() const;//獲取指向尾元素的const迭代器
3、char* begin();//獲取指向首元素的迭代器
4、char* end();//獲取指向尾元素的迭代器
typedef char* iterator;
typedef const char* const_iterator;const char* begin() const
{return (const char*)_str;//返回首元素地址,const修飾因此強轉類型
}
const char* end() const
{return (const char*)_str + _size;//尾元素下一個位置地址,即\0位置地址
}
char* begin()
{return _str;
}
char* end()
{return _str + _size;
}
3、字符串操作?
1、const char* c_str() const;
//獲取C字符串首元素地址
2、size_t find(char ch, size_t pos = 0) const;
//從pos位置(默認從0位置)找字符ch,找到則返回下標,否則返回npos
3、size_t find(const char* sub, size_t pos = 0) const;//從字符串sub的pos位置找是否有匹配的字符串,找到則返回第一個元素下標,否則返回npos
4、string substr(size_t pos = 0, size_t len = npos);//從pos位置截取len長度(默認截取整個字符串)的子串
const char* c_str() const
{return _str;//返回首地址
}
size_t find(char ch, size_t pos = 0) const
{assert(pos < _size);//小于字符串大小才能進行查找for (size_t i = 0; i < _size; i++)//遍歷字符串{if (_str[i] == ch)return i;//找到字符則返回下標}return npos;
}
size_t find(const char* sub, size_t pos = 0) const
{assert(pos < _size);const char* p = strstr(sub + pos, _str);//從sub+pos位置找,調用C語言庫的找子串函數,找到則返回該值的地址,否則返回NULLif (p)//不為空則返回下標,指針相減即為相差個數,即下標{return p - _str;}else//為空返回npos{return npos;}
}
string substr(size_t pos = 0, size_t len = npos)
{assert(pos < _size);string sub;if (len >= _size - pos)//長度大于_size-pos即將整個字符串截取,也包括len==npos{for (size_t i = pos; i < _size; i++){sub += _str[i];//追加給sub}}else//否則截取len長度{for (size_t i = pos; i < len + pos; i++){sub += _str[i];}}return sub;
}
4、非成員函數重載操作
1、void swap(string& s1, string& s2);
//將類s1數據與類s2數據交換
2、bool operator==(const string& s1, const string& s2);//比較s1與s2是否相等
3、bool operator<(const string& s1, const string& s2);//比較s1是否小于s2
4、ostream& operator<<(ostream& out, const string& s);//流插入,即打印字符串s
5、istream& operator>>(istream& in, string& s);//流提取,即將輸入的內容給s
6、istream& getline(istream& in, string& s);//獲取一行信息,即將輸入中回車之前的信息給s
void swap(string& s1, string& s2)
{s1.swap(s2);//調用類成員交換函數,跟庫函數中交換函數重載,先調用類成員函數
}
bool operator==(const string& s1, const string& s2)
{int ret = strcmp(s1.c_str(), s2.c_str());//調用C語言比較字符串函數,等于0則相等return ret == 0;
}
bool operator<(const string& s1, const string& s2)
{int ret = strcmp(s1.c_str(), s2.c_str());return ret < 0;
}ostream& operator<<(ostream& out, const string& s)
{for (auto ch : s){out << ch;//用范圍for變量類}return out;
}istream& operator>>(istream& in, string& s)
{s.clear();//清空串schar ch = in.get();//C++庫中輸入函數,讀取一個字符給chchar buff[128];//先開辟一個128字節空間,減少頻繁擴容size_t i = 0;while (ch != '\n' && ch != ' ')//流提取不識別空格回車{buff[i++] = ch;//將字符賦值給buff數組if (i == 127)//字符串滿了則追加給串s{buff[127] = '\0';//末尾追加標志符\0s += buff;i = 0;//再重新賦值字符給buff數組}ch = in.get();}if (i > 0)//i>0則再追加數據給s{buff[i] = '\0';s += buff;}return in;
}
istream& getline(istream& in, string& s)
{s.clear();char ch = in.get();char buff[128];size_t i = 0;while (ch != '\n')//不識別回車,其他原理同流插入{buff[i++] = ch;if (i == 127){buff[127] = '\0';s += buff;i = 0;}ch = in.get();}if (i > 0){buff[i] = '\0';s += buff;}return in;
}
總結
本篇博客就結束啦,謝謝大家的觀看,如果公主少年們有好的建議可以留言喔,謝謝大家啦!