深入浅出分析C++ string底层原理

深入浅出分析C++ string底层原理

前言

在 C++ 中,string 类型是经常使用的字符串类型。了解 string 类的底层实现原理可以更好地理解其各种方法的行为,从而在编写程序时更加得心应手。本文将从以下几个方面对 string 类的底层实现进行说明:

  1. string 类的结构
  2. string 类的构造函数
  3. string 类的拷贝构造函数
  4. string 类的赋值操作符
  5. string 类的插入操作
  6. string 类的删除操作

string 类的结构

class string{
    char* str;
    size_t len;
};

如上所示,C++ 的 string 类内部主要包含了一个指向字符数组的指针,以及表示字符串长度的 size_t 类型变量。实际上,string 类在底层是使用一个动态分配的字符数组来保存字符串,而 str 指向的正是这个字符数组。由于字符数组是动态分配的,所以可以在程序运行时动态地改变字符串的长度。

string 类的构造函数

C++ 的 string 类有多个构造函数,在此只说明最基本的一个构造函数:

string::string(const char* s){
    len=std::strlen(s);
    str=new char[len+1];
    std::strcpy(str,s);
}

可以看出,string 类的构造函数主要做了两件事情:

  1. 计算字符串长度
  2. 动态分配字符数组,并将原始字符串拷贝进该数组

下面通过一个示例说明 string 类的构造函数行为:

#include <iostream>
#include <string>

using namespace std;

int main(){
    string s1("Hello, world!");
    cout << s1 << endl;
    return 0;
}

运行上述代码,输出结果为:

Hello, world!

可以看出,string 类的构造函数成功地将原始字符串 "Hello, world!" 拷贝进了动态分配的字符数组中,并正确地计算了字符串的长度。

string 类的拷贝构造函数

C++ 的 string 类还有一个拷贝构造函数,其定义如下:

string::string(const string& s){
    len=s.len;
    str=new char[len+1];
    std::strcpy(str,s.str);
}

可以看出,string 类的拷贝构造函数主要做了两件事情:

  1. 复制字符串长度
  2. 动态分配字符数组,并将原始字符串拷贝进该数组

下面通过一个示例说明 string 类的拷贝构造函数行为:

#include <iostream>
#include <string>

using namespace std;

int main(){
    string s1("Hello, world!");
    string s2(s1);
    cout << s2 << endl;
    return 0;
}

运行上述代码,输出结果为:

Hello, world!

可以看出,string 类的拷贝构造函数成功地将 s1 中的字符串拷贝进了 s2 中,并正确地计算了字符串的长度。

string 类的赋值操作符

C++ 的 string 类还重载了赋值操作符,其定义如下:

string::string& operator=(const string& s){
    if(this!=&s){
        delete[] str;
        len=s.len;
        str=new char[len+1];
        std::strcpy(str,s.str);
    }
    return *this;
}

可以看出,string 类的赋值操作符主要做了以下几件事情:

  1. 检查是否自我赋值,若自我赋值则直接返回。
  2. 删除原有的字符数组。
  3. 复制字符串长度。
  4. 动态分配字符数组,并将原始字符串拷贝进该数组。

下面通过一个示例说明 string 类的赋值操作符行为:

#include <iostream>
#include <string>

using namespace std;

int main(){
    string s1("Hello, world!");
    string s2;
    s2 = s1;
    cout << s2 << endl;
    return 0;
}

运行上述代码,输出结果为:

Hello, world!

可以看出,string 类的赋值操作符成功地将 s1 中的字符串拷贝进了 s2 中,并正确地计算了字符串的长度。

string 类的插入操作

C++ 的 string 类提供了多种插入操作,例如 insert 函数、 push_back 函数等。下面以 insert 函数为例进行说明:

string::iterator insert(iterator it,char c){
    size_t pos=it-str;
    size_t oldlen=len;
    len++;
    str=new char[len+1];
    std::memcpy(str,it,oldlen-pos);
    str[pos]=c;
    std::memcpy(str+pos+1,it+pos,oldlen-pos);
    return str+pos+1;
}

可以看出,insert 函数主要做了以下几件事情:

  1. 计算插入位置。
  2. 调整字符串长度。
  3. 动态分配字符数组,并将原始字符串拷贝进该数组。
  4. 在插入位置插入新字符。

下面通过一个示例说明 string 类的 insert 函数行为:

#include <iostream>
#include <string>

using namespace std;

int main(){
    string s1("world!");
    s1.insert(s1.begin(),'H');
    cout << s1 << endl;
    return 0;
}

运行上述代码,输出结果为:

Hello, world!

可以看出,insert 函数成功地在字符串 s1 的开头插入了字符 'H'。

string 类的删除操作

C++ 的 string 类提供了多种删除操作,例如 erase 函数、 pop_back 函数等。下面以 erase 函数为例进行说明:

string::iterator erase(iterator first,iterator last){
    size_t pos=first-str;
    size_t oldlen=len;
    len-=last-first;
    str=new char[len+1];
    std::memcpy(str,first,pos);
    std::memcpy(str+pos,last,oldlen-pos);
    return str+pos;
}

可以看出,erase 函数主要做了以下几件事情:

  1. 计算删除区间。
  2. 调整字符串长度。
  3. 动态分配字符数组,并将原始字符串拷贝进该数组。
  4. 删除指定区间的字符。

下面通过一个示例说明 string 类的 erase 函数行为:

#include <iostream>
#include <string>

using namespace std;

int main(){
    string s1("Hello, world!");
    s1.erase(5,7);
    cout << s1 << endl;
    return 0;
}

运行上述代码,输出结果为:

Hello!

可以看出,erase 函数成功地删除了字符串 s1 中位置 5-11 的字符。

结语

C++ 的 string 类提供了丰富的字符串操作方法,其底层实现涉及到动态分配字符数组、拷贝构造函数、赋值操作符等多个方面。希望本文的解释能够让读者更好地理解 string 类的底层工作方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅出分析C++ string底层原理 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Win7旗舰版升级Win10提示错误代码C1900107的解决方法

    下面是详细讲解“Win7旗舰版升级Win10提示错误代码C1900107的解决方法”的完整攻略。 问题描述 在升级Win7旗舰版到Win10时,可能会出现错误代码C1900107的提示,导致升级失败。这个错误通常是由于系统内存不足或硬盘空间不足所导致的。 解决方法 针对这个问题,可以采取以下几个步骤来解决: 步骤1:清理硬盘空间 由于Win10系统占用的空间…

    C 2023年5月23日
    00
  • C++基于特征向量的KNN分类算法

    C++基于特征向量的KNN分类算法的完整攻略可以分为以下几个步骤: 1. 数据预处理 首先,需要对训练数据进行预处理,将其转换为特征向量的形式。对于图像等多维数据,可以使用特征提取的方法,如SIFT、HOG等来获得其特征向量;对于其他数据,可以根据具体情况选择适当的方法将其转换为特征向量。 2. 计算距离 KNN算法是一种基于距离的分类算法,因此在使用KNN…

    C 2023年5月22日
    00
  • C语言文件操作的入门详解教程

    C语言文件操作的入门详解教程 在C语言程序中,文件操作是一项非常重要的技能。文件操作可以让程序读取和写入文件内容,将程序的输入和输出保存在文件中,实现文件的创建、读取、写入和删除等操作。本教程将从基本概念和语法讲解开始,深入介绍C语言文件操作的方法和技巧,旨在帮助初学者快速上手,并能完成各种文件操作任务。 1.文件操作基础 在C语言中,文件操作有两种基本方式…

    C 2023年5月23日
    00
  • java8新特性之stream的collect实战教程

    Java8新特性之Stream的Collect实战教程 前言 在 Java 8 的新特性中,有一个非常强大的用于流式操作的 API,那便是 Stream。在 Stream 中提供了非常好用且灵活的方法,对于集合中数据的操作具备了强大的支持。而其中 collect() 方法在实际的应用中尤为常见,在这篇文章中,我们将介绍 Stream 中的 collect()…

    C 2023年5月23日
    00
  • 浅析c语言中的内存

    浅析C语言中的内存 什么是内存 内存是一种存储数据的硬件设备,是计算机中最基本的组成部分之一。内存根据尺寸的不同,又分成不同的级别,从而形成了”字节(Byte)”、”千字节(KB)”、”兆字节(MB)”、”吉字节(GB)”等不同的规模。在C语言中,内存被划分为若干个地址,每个地址可以存储一个字节(Byte)的数据。 C语言中内存的使用 在C语言中,我们可以通…

    C 2023年5月24日
    00
  • 基于C++实现一个日期计算器

    基于C++实现一个日期计算器有以下几个步骤: 1. 设计思路 首先我们需要设计计算日期的算法。我们可以使用公元元年(即公元1年1月1日)为基准日期,将将任意年份的日期转化为距离基准日期的天数,然后进行日期计算。 我们需要实现以下功能: 输入两个日期,计算它们之间相差的天数 给定一个日期和一个天数,计算它的下一天日期 2. 代码实现 我们可以针对以上两个需求分…

    C 2023年5月23日
    00
  • C/C++项目编译工具简单介绍

    C/C++项目编译工具简单介绍 C/C++是一种面向过程的编程语言,尤其适合写高性能的、低延迟的程序。在实际使用过程中,我们需要借助一些编译工具来将源代码转换成可执行文件。本文介绍几种常见的C/C++编译工具,以及他们的使用方法。 1. GCC/G++ GCC是GNU Compiler Collection的缩写,是一个集合体,包含了C、C++、Object…

    C 2023年5月23日
    00
  • C++实现简单的通讯录管理系统

    下面我来详细讲解“C++实现简单的通讯录管理系统”的完整攻略。 系统概述 通讯录管理系统是一个简单的信息管理系统。该系统可以实现以下功能: 添加联系人 显示联系人 删除联系人 查找联系人 修改联系人 清空联系人 退出通讯录管理系统 系统实现过程 设计流程 分析需求,确定功能模块 绘制流程图,确定各模块的处理流程 完成代码实现 运行测试 编写代码 首先,我们需…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部