当前位置:首页 C++ > 正文

c++string类的模拟实现:扩容

作者:野牛程序员:2024-01-03 14:32:03 C++阅读 2457

C++的字符串类(std::string)通常会在需要时动态扩容以容纳更多的字符。以下是一个简化的C++字符串类的扩容模拟实现,用于展示如何处理扩容的情况。

#include <iostream>
#include <cstring>

class MyString {
private:
    char* data;
    size_t length;
    size_t capacity;

public:
    MyString() : data(nullptr), length(0), capacity(0) {}

    // 构造函数
    MyString(const char* str) {
        length = strlen(str);
        capacity = length + 1; // 包括字符串结束符'\\0'
        data = new char[capacity];
        strcpy(data, str);
    }

    // 析构函数
    ~MyString() {
        delete[] data;
    }

    // 获取字符串长度
    size_t size() const {
        return length;
    }

    // 获取字符串容量
    size_t get_capacity() const {
        return capacity;
    }

    // 获取字符串内容
    const char* c_str() const {
        return data;
    }

    // 添加字符
    void append(char c) {
        if (length + 1 < capacity) {
            data[length++] = c;
            data[length] = '\\0'; // 更新字符串结束符
        } else {
            // 扩容
            size_t new_capacity = capacity * 2;
            char* new_data = new char[new_capacity];
            strcpy(new_data, data);
            delete[] data;
            data = new_data;
            capacity = new_capacity;
            // 添加字符
            data[length++] = c;
            data[length] = '\\0'; // 更新字符串结束符
        }
    }
};

int main() {
    MyString myStr("Hello");
    std::cout << "Original String: " << myStr.c_str() << " (Capacity: " << myStr.get_capacity() << ")" << std::endl;

    // 模拟扩容
    myStr.append(' ');
    myStr.append('W');
    myStr.append('o');
    myStr.append('r');
    myStr.append('l');
    myStr.append('d');

    std::cout << "Modified String: " << myStr.c_str() << " (Capacity: " << myStr.get_capacity() << ")" << std::endl;

    return 0;
}

这个简单的模拟实现中,append 函数用于向字符串末尾添加字符,如果当前容量不足,则会进行扩容。扩容时,将字符串内容复制到新的更大的内存块,并释放旧内存块。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击