【C++】string类的模拟实现(增删查改,比大小,运算符重载)
发布人:shili8
发布时间:2025-02-11 00:01
阅读次数:0
**C++ string 类的模拟实现**
在 C++ 中,`std::string` 是一个非常重要的类,它提供了字符串的基本操作,如增删查改、比大小等功能。然而,在实际开发中,我们可能需要自己实现一个 `string` 类来满足特定的需求。在本文中,我们将模拟实现一个 `string` 类,包括增删查改、比大小等功能,并对其进行运算符重载。
###1. string 类的定义首先,我们定义一个 `string` 类,它包含以下成员变量:
cppclass String { private: char* str; // 字符串内容 int len; // 字符串长度public: String(); // 构造函数 ~String(); // 析构函数 void append(char c); // 向字符串追加一个字符 void insert(int pos, char c); // 在指定位置插入一个字符 void erase(int pos); // 删除指定位置的字符 int compare(const String& str) const; // 比较两个字符串 bool operator<(const String& str) const; // 小于运算符重载 bool operator>(const String& str) const; // 大于运算符重载 bool operator==(const String& str) const; // 等于运算符重载};
###2. 构造函数和析构函数在 `string` 类中,我们需要定义一个构造函数来初始化成员变量,一个析构函数来释放内存:
cppString::String() { str = new char[1]; // 初始化长度为1的字符串 len =0; } String::~String() { delete[] str; //释放内存}
###3. 向字符串追加一个字符我们实现了 `append` 函数来向字符串追加一个字符:
cppvoid String::append(char c) { char* temp = new char[len +2]; // 创建临时空间 strcpy(temp, str); // 复制原有内容 temp[len] = c; // 追加新字符 temp[len +1] = '0'; // 结尾符号 delete[] str; //释放原有内存 str = temp; // 更新字符串指针 len++; // 更新长度}
###4. 在指定位置插入一个字符我们实现了 `insert` 函数来在指定位置插入一个字符:
cppvoid String::insert(int pos, char c) { if (pos < 0 || pos > len) { // 检查位置合法性 return; } char* temp = new char[len +2]; // 创建临时空间 strcpy(temp, str); // 复制原有内容 for (int i = len; i >= pos; --i) { temp[i +1] = temp[i]; // 移位字符 } temp[pos] = c; // 插入新字符 temp[len +1] = '0'; // 结尾符号 delete[] str; //释放原有内存 str = temp; // 更新字符串指针 len++; // 更新长度}
###5. 删除指定位置的字符我们实现了 `erase` 函数来删除指定位置的字符:
cppvoid String::erase(int pos) { if (pos < 0 || pos >= len) { // 检查位置合法性 return; } char* temp = new char[len -1]; // 创建临时空间 strcpy(temp, str); // 复制原有内容 for (int i =0; i < pos; ++i) { temp[i] = str[i]; // 移位字符 } for (int i = pos +1; i <= len; ++i) { temp[i -1] = str[i]; // 移位字符 } delete[] str; //释放原有内存 str = temp; // 更新字符串指针 len--; // 更新长度}
###6. 比较两个字符串我们实现了 `compare` 函数来比较两个字符串:
cppint String::compare(const String& str) const { int min_len = (len < str.len ? len : str.len); // 确定最小长度 for (int i =0; i < min_len; ++i) { // 比较前min_len个字符 if (str.str[i] != str[i]) { // 如果不相等,返回比较结果 return str.str[i] - str[i]; } } return len - str.len; // 如果长度相同,返回长度差异}
###7. 运算符重载我们对 `string` 类进行运算符重载:
cppbool String::operator<(const String& str) const { return compare(str) < 0; } bool String::operator>(const String& str) const { return compare(str) >0; } bool String::operator==(const String& str) const { return compare(str) ==0; }
###8. 测试我们测试 `string` 类的功能:
cppint main() { String s1, s2; s1.append('a'); s1.append('b'); s1.append('c'); s2.append('d'); s2.append('e'); s2.append('f'); std::cout << "s1: " << s1.str << std::endl; // 输出s1 std::cout << "s2: " << s2.str << std::endl; // 输出s2 s1.insert(0, 'x'); // 在s1的头部插入字符 s2.erase(3); // 删除s2的第4个字符 std::cout << "s1: " << s1.str << std::endl; // 输出更新后的s1 std::cout << "s2: " << s2.str << std::endl; // 输出更新后的s2 if (s1 < s2) { std::cout << "s1小于s2" << std::endl; } else if (s1 > s2) { std::cout << "s1大于s2" << std::endl; } else { std::cout << "s1等于s2" << std::endl; } return0; }
在本文中,我们模拟实现了一个 `string` 类,包括增删查改、比大小等功能,并对其进行运算符重载。我们测试了 `string` 类的功能,确保其正确性和有效性。