当前位置:实例文章 » JAVA Web实例» [文章]C++-string类的模拟实现

C++-string类的模拟实现

发布人:shili8 发布时间:2025-01-07 12:49 阅读次数:0

**C++ string 类的模拟实现**

在 C++ 中,`std::string` 是一个非常重要的类,它提供了对字符串的基本操作,如查找、替换、插入等。然而,在某些情况下,我们可能需要自己实现一个 `string` 类来满足特定的需求。在本文中,我们将模拟实现 C++ 的 `string` 类。

###1. 概述我们的 `String` 类将提供以下功能:

* 构造函数:支持多种构造方式,如从 `const char*`、`char`、`std::string` 等创建。
* 赋值运算符:支持赋值给其他 `String` 对象或 `const char*`。
* 常用操作函数:
* `size()`:返回字符串长度。
* `empty()`:判断是否为空。
* `find()`:查找子串。
* `replace()`:替换子串。
* `insert()`:插入子串。
* 其他功能,如 `substr()、erase()` 等。

###2. 构造函数

cpp// 构造函数模拟实现String::String(const char* str) {
 if (str == nullptr) {
 // 处理空指针 len =0;
 data = new char[1];
 *data = '0';
 } else {
 len = strlen(str);
 data = new char[len +1];
 strcpy(data, str);
 }
}

String::String(char c) {
 len =1;
 data = new char[2];
 data[0] = c;
 data[1] = '0';
}

String::String(const String& other) {
 len = other.len;
 data = new char[len +1];
 strcpy(data, other.data);
}


###3. 赋值运算符
cpp// 赋值运算符模拟实现String& String::operator=(const String& other) {
 if (this != &other) {
 delete[] data;
 len = other.len;
 data = new char[len +1];
 strcpy(data, other.data);
 }
 return *this;
}

String& String::operator=(const char* str) {
 if (str == nullptr) {
 // 处理空指针 delete[] data;
 len =0;
 data = new char[1];
 *data = '0';
 } else {
 delete[] data;
 len = strlen(str);
 data = new char[len +1];
 strcpy(data, str);
 }
 return *this;
}


###4. 常用操作函数
cpp// size() 模拟实现size_t String::size() const {
 return len;
}

// empty() 模拟实现bool String::empty() const {
 return len ==0;
}

// find() 模拟实现size_t String::find(const char* str) const {
 if (str == nullptr || strlen(str) > len) {
 return -1; // 未找到或超出长度 }
 int i =0;
 while (i <= len - strlen(str)) {
 bool match = true;
 for (int j =0; j < strlen(str); ++j) {
 if (data[i + j] != str[j]) {
 match = false;
 break;
 }
 }
 if (match) return i;
 ++i;
 }
 return -1; // 未找到}

// replace() 模拟实现String& String::replace(const char* oldStr, const char* newStr) {
 size_t oldLen = strlen(oldStr);
 size_t newLen = strlen(newStr);
 if (oldLen > len || newLen >= len - oldLen +1) {
 // 处理长度不符或新字符串过长 delete[] data;
 len -= oldLen;
 strcpy(data, this->data);
 strcat(data, newStr);
 return *this;
 }
 int i = find(oldStr);
 if (i == -1) return *this; // 未找到 size_t j =0;
 while (j < len && j <= i + oldLen) {
 data[j] = this->data[j];
 ++j;
 }
 for (; j < len; ++j) {
 if (i <= j - newLen) {
 data[j - newLen] = newStr[j - i];
 } else {
 data[j] = this->data[j];
 }
 }
 return *this;
}

// insert() 模拟实现String& String::insert(size_t pos, const char* str) {
 size_t oldLen = strlen(str);
 if (pos > len || pos + oldLen >= len) {
 // 处理位置不符或新字符串过长 delete[] data;
 len += oldLen;
 strcpy(data, this->data);
 strcat(data, str);
 return *this;
 }
 int i =0;
 while (i < pos) {
 data[i + oldLen] = this->data[i];
 ++i;
 }
 for (; i <= pos; ++i) {
 data[i] = str[i - pos];
 }
 len += oldLen;
 return *this;
}


###5. 其他功能
cpp// substr() 模拟实现String String::substr(size_t pos, size_t count) const {
 if (pos >= len || count > len - pos) {
 // 处理位置不符或长度不符 return String();
 }
 int i =0;
 while (i < pos) {
 data[i] = this->data[i];
 ++i;
 }
 for (; i < pos + count; ++i) {
 data[i - pos] = this->data[i];
 }
 len = count;
 return *this;
}

// erase() 模拟实现String& String::erase(size_t pos, size_t count) {
 if (pos >= len || count > len - pos) {
 // 处理位置不符或长度不符 delete[] data;
 len -= count;
 strcpy(data, this->data + pos);
 return *this;
 }
 int i =0;
 while (i < pos) {
 data[i] = this->data[i];
 ++i;
 }
 for (; i <= pos + count; ++i) {
 data[i - count] = this->data[i];
 }
 len -= count;
 return *this;
}


以上就是 C++ string 类的模拟实现。这个类提供了基本的字符串操作功能,如查找、替换、插入等。

其他信息

其他资源

Top