類定義
cpp
namespace ym {class string {private:char* _str; // 字符串數據size_t _size; // 當前字符串長度size_t _capacity; // 當前分配的內存容量static const size_t npos = -1; // 特殊值,表示最大可能位置public:// 構造函數和析構函數string(const char* str = "");string(const string& s);~string();// 迭代器支持typedef char* iterator;typedef const char* const_iterator;iterator begin();iterator end();// ... 其他成員函數}; }
核心功能實現
1. 內存管理
reserve() 函數
cpp
void string::reserve(size_t n) {if (n > _capacity) {char* str = new char[n + 1]; // 多分配1字節存放'\0'strcpy(str, _str);delete[] _str;_str = str;_capacity = n;} }
push_back() 函數
cpp
void string::push_back(char ch) {if (_size == _capacity) {reserve(_capacity == 0 ? 4 : 2 * _capacity); // 初始容量為4,之后每次翻倍}_str[_size++] = ch;_str[_size] = '\0'; // 確保字符串始終以'\0'結尾 }
2. 字符串操作
append() 函數
cpp
void string::append(const char* str) {size_t len = strlen(str);if (_size + len > _capacity) {reserve(max(_size + len, 2 * _capacity)); // 按需擴容}strcat(_str + _size, str); // 追加字符串_size += len; }
insert() 函數
cpp
void string::insert(size_t pos, const char* str) {assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity) {reserve(_size + len);}// 向后移動字符memmove(_str + pos + len, _str + pos, _size - pos + 1); // +1包含'\0'// 插入新內容memcpy(_str + pos, str, len);_size += len; }
3. 運算符重載
賦值運算符
cpp
string& string::operator=(string s) {if (this != &s) { // 防止自賦值delete[] _str;_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}return *this; }
比較運算符
cpp
bool operator<(const string& s1, const string& s2) {return strcmp(s1.c_str(), s2.c_str()) < 0; } // 其他比較運算符類似...
4. 流操作符
輸出運算符
cpp
ostream& operator<<(ostream& out, const string& s) {for (auto ch : s) { // 使用范圍for循環out << ch;}return out; }
輸入運算符(優化版)
cpp
istream& operator>>(istream& in, string& s) {s.clear();const int N = 256; // 緩沖區大小char buff[N];int i = 0;char ch;// 跳過前導空白while (in.get(ch) && isspace(ch)) {}// 讀取直到遇到空白if (!in.eof()) {do {buff[i++] = ch;if (i == N - 1) { // 緩沖區快滿時buff[i] = '\0';s += buff;i = 0;}} while (in.get(ch) && !isspace(ch));// 處理剩余字符if (i > 0) {buff[i] = '\0';s += buff;}}return in; }
關鍵設計點
內存管理:
使用
new[]
和delete[]
手動管理內存采用指數級擴容策略(初始4,之后每次翻倍)
始終確保字符串以
'\0'
結尾
異常安全:
賦值運算符使用拷貝交換慣用法
關鍵操作前進行斷言檢查
性能優化:
輸入操作符使用緩沖區減少擴容次數
使用
memmove
和memcpy
提高大塊數據操作效率
標準兼容:
提供迭代器支持
實現完整的比較運算符
支持流操作符
使用示例
cpp
ym::string s1 = "Hello"; ym::string s2 = "World";s1 += " "; s1 += s2; // s1變為"Hello World"cout << s1 << endl; // 輸出: Hello Worldym::string s3; cin >> s3; // 讀取輸入