C++之string相关(入门级)

目录

1. 引言

2. C语言中的字符串与C++ string类的对比

3. C++ string类概述

3.1 string类的构造与初始化

3.2 string类的基本操作

3.3 string类的查找和替换

3.4 string类的遍历

4. C++11新特性在string类中的应用

5. string类的模拟实现

5.1 浅拷贝和深拷贝

浅拷贝示例:

深拷贝示例:

6. 总结与扩展阅读


1. 引言

C++ string是用于字符串操作的重要工具之一。相比于C语言中以字符数组形式存储的字符串,C++的string类在功能和安全性上有了显著提升。由于string封装了字符串的存储与操作,我们在使用时不必过多担心底层内存管理问题。这在编程中减少了潜在的内存泄漏与越界访问风险,是现代C++开发的核心之一

在这篇文章中,我们将深入探讨string类的各种功能,包括基本操作、常用接口、内部实现机制以及模拟string类的基本方法,最终让您更深入地理解和掌握string类的用法和原理。


2. C语言中的字符串与C++ string类的对比

在C语言中,字符串以字符数组的形式存储,以\0结尾。C语言的字符串操作依赖于手动管理内存,程序员需要使用诸如strcpy()strcat()等函数来操作字符串。

C语言字符串的基本操作

#include <stdio.h>
#include <string.h>

int main() {
    char str1[20] = "Hello, C!";
    char str2[20];
    
    // 字符串复制
    strcpy(str2, str1);
    printf("str2: %s\n", str2);
    
    // 字符串连接
    strcat(str1, " World");
    printf("str1: %s\n", str1);
    
    // 字符串长度
    printf("Length of str1: %lu\n", strlen(str1));
    
    return 0;
}

问题:C语言的字符串在操作上较为复杂且容易出错。例如,如果目标数组str2的空间不足以容纳被复制的内容,程序将面临越界的风险。

在C++中,string类避免了上述问题,自动管理字符串的内存,支持运算符重载和面向对象的方法调用。C++中的字符串可以这样初始化并操作:

C++ string类的基本操作

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str1 = "Hello, C++!";
    string str2 = str1;     // 拷贝构造
    str1 += " Welcome!";    // 字符串拼接
    
    cout << "str1: " << str1 << endl;  // 输出 Hello, C++! Welcome!
    cout << "str2: " << str2 << endl;  // 输出 Hello, C++!
    
    cout << "Length of str1: " << str1.length() << endl;
    
    return 0;
}

C++优势:在C++中,string类自动管理内存,同时为字符串操作提供了更加直观和简洁的语法,这些特性极大提高了编程的安全性和开发效率。


3. C++ string类概述

C++中的string类支持多种操作,包括字符串的构造、修改、查找和遍历等。

3.1 string类的构造与初始化

string类提供了多种构造方法,可以创建空字符串、以C字符串初始化字符串或通过字符和长度创建字符串:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s1;                  // 默认构造空字符串
    string s2("Hello, C++!");   // 以C字符串初始化
    string s3(s2);              // 拷贝构造
    string s4(5, 'a');          // 构造包含5个字符'a'的字符串 "aaaaa"
    
    cout << "s1: " << s1 << endl;   // 输出空字符串
    cout << "s2: " << s2 << endl;   // 输出 "Hello, C++!"
    cout << "s3: " << s3 << endl;   // 输出 "Hello, C++!"
    cout << "s4: " << s4 << endl;   // 输出 "aaaaa"
    
    return 0;
}

3.2 string类的基本操作

string类提供了访问、修改字符串的方法,如at()push_back()append()clear()等。

访问与修改字符

string s = "Hello";
cout << s[1] << endl;     // 使用[]操作符输出 'e'
cout << s.at(1) << endl;  // 使用at()输出 'e',更安全

注意at()方法在访问越界时会抛出异常,而[]操作符不会,因此在一些严格的场景中at()更加安全。

添加字符和字符串

string s = "Hello";
s.push_back('!');         // 添加单个字符
cout << s << endl;        // 输出 "Hello!"

s.append(" World");       // 添加字符串
cout << s << endl;        // 输出 "Hello! World"

清空和判断字符串

string s = "Hello";
s.clear();               // 清空字符串
cout << s.empty() << endl;  // 输出 1 (true) 表示字符串为空

3.3 string类的查找和替换

查找是string类中非常常用的操作之一,可以通过find()rfind()来在字符串中搜索特定子串或字符,并使用replace()替换指定位置的子串:

string s = "Hello, C++!";
size_t pos = s.find("C++");    // 查找子串"C++"
if (pos != string::npos) {
    s.replace(pos, 3, "World"); // 将"C++"替换为"World"
}
cout << s << endl;            // 输出 "Hello, World!"

3.4 string类的遍历

可以使用for循环或范围for进行遍历。后者在C++11中引入,使代码更简洁。

string s = "Hello";
for (char c : s) {
    cout << c << ' ';
}
cout << endl; // 输出 H e l l o

4. C++11新特性在string类中的应用

C++11引入了auto关键字和范围for循环,简化了对string类的使用。

auto关键字auto让编译器自动推断变量类型,在string类操作中尤为方便。例如在使用迭代器遍历string时:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello, C++11!";
    for (auto it = str.begin(); it != str.end(); ++it) {
        cout << *it << ' ';
    }
    return 0;
}

范围for循环:C++11的范围for使代码更简洁,尤其在遍历和修改字符时。

string str = "Hello, C++11!";
for (auto& ch : str) {
    if (ch == ' ') {
        ch = '_';
    }
}
cout << str << endl;   // 输出 "Hello,_C++11!"

5. string类的模拟实现

为了更好地理解string类的内部机制,我们可以模拟实现一个简化版的String类,重点在于深拷贝浅拷贝

5.1 浅拷贝和深拷贝

浅拷贝:在对象复制时,只复制对象中的指针地址,而不是复制实际内容。这会导致多个对象共享同一块内存。

深拷贝:在对象复制时,同时复制数据,从而实现每个对象都拥有独立的内存

浅拷贝示例

class String {
public:
    String(const char* str = "") {
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }

    // 浅拷贝的拷贝构造
    String(const String& s) {
        _str = s._str;
    }

    ~String() {
        delete[] _str;
    }

private:
    char* _str;
};

在这个例子中,当String对象销毁时,将导致内存重复释放的问题,因为多个对象共享相同的内存空间。

深拷贝示例

class String {
public:
    String(const char* str = "") {
        _str = new char[strlen(str) + 1

以下是一个简单的String类模拟,实现了深拷贝以避免资源共享问题:

#include <iostream>
#include <cstring>
#include <cassert>
using namespace std;

class String {
public:
    String(const char* str = "") {
        if (str == nullptr) {
            _str = new char[1];
            *_str = '\0';
        } else {
            _str = new char[strlen(str) + 1];
            strcpy(_str, str);
        }
    }
    
    // 深拷贝构造函数
    String(const String& s) {
        _str = new char[strlen(s._str) + 1];
        strcpy(_str, s._str);
    }
    
    // 深拷贝赋值运算符
    String& operator=(const String& s) {
        if (this != &s) {
            delete[] _str;
            _str = new char[strlen(s._str) + 1];
            strcpy(_str, s._str);
        }
        return *this;
    }
    
    ~String() {
        delete[] _str;
    }

private:
    char* _str;
};

在上述代码中,我们通过自定义的拷贝构造函数和赋值运算符,确保每个String对象都持有独立的字符串数据,避免了浅拷贝带来的潜在问题。

6. 总结与扩展阅读

C++中的string类提供了安全、便捷、功能强大的字符串操作接口。掌握string类有助于提高代码的健壮性,并能大幅减少由内存管理带来的问题。学习string类的实现和用法,对理解C++标准库以及面向对象编程具有深远意义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/888694.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pikachu-url重定向-不安全的url跳转

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …

Dev-C++ 安装与使用(dev c++官网)(已解决)

1.Dev-C的安装 ①打开Dev-C的官网(https://sourceforge.net/projects/orwelldevcpp/ )&#xff1b;点击Download(下载)&#xff0c;等待5秒后开始下载。 ②点开下载好的EXE文件&#xff0c;等待加载完成(如图)。 右键&#xff0c;以管理员身份 运行安装包。 选择English(英语),…

JVS·智能BI数据可视化图表:普通列表与分组列表配置全解析

使用场景 在可视化配置中&#xff0c;很多场景中需要图形和详细信息的融合展示&#xff0c;那么在图表中可以新增普通列表与分组列表的配置。如下图所示&#xff1a; 配置说明 1、新增组件&#xff1a;配置入口如下图所示&#xff0c;新增组件时&#xff0c;选择普通列表与分…

浅谈司库决策分析体系建设

一 、前言&#xff1a;司库管理体系建设 2022年国务院国资委印发《关于推动中央企业加快司库体系建设进一步加强资金管理的意见》&#xff0c;指出司库管理体系是企业集团依托财务公司、资金中心等管理平台&#xff0c;运用现代网络信息技术&#xff0c;以资金集中和信息集中为…

【iOS】计算器仿写

计算器 前言四则运算View层Masonry布局 非法输入的逻辑 前言 前两周进行了计算器的仿写&#xff0c;运用了刚学习的Masonry布局以及MVC框架&#xff0c;同时学习了简单的四则运算&#xff0c;今天撰写博客对计算器的仿写进行一个总结&#xff0c;整理归纳期间遇到的问题和收获…

污水排放口细粒度检测数据集,污-水排放口的类型包括10类目标,10000余张图像,yolo格式目标检测,9GB数据量。

污水排放口细粒度检测数据集&#xff0c;污-水排放口的类型包括10类目标&#xff08;1 合流下水道&#xff0c;2 雨水&#xff0c;3 工业废水&#xff0c;4 农业排水&#xff0c;5 牲畜养殖&#xff0c;6 水产养殖&#xff0c;7 地表径流&#xff0c;8 废水处理厂&…

PHP中的HTTP请求:获取taobao商品数据的艺术

在电子商务的世界里&#xff0c;数据是宝贵的资产。对于开发者来说&#xff0c;能够快速准确地获取商品数据是一项重要的技能。PHP作为一种流行的服务器端脚本语言&#xff0c;结合cURL扩展&#xff0c;可以轻松实现HTTP请求&#xff0c;从而获取API数据。本文将介绍如何在PHP中…

使用MTVerseXR SDK实现VR串流

1、概述​ MTVerseXR SDK 是摩尔线程GPU加速的虚拟现实&#xff08;VR&#xff09;流媒体平台&#xff0c;专门用于从远程服务器流式传输基于标准OpenXR的应用程序。MTVerseXR可以通过Wi-Fi和USB流式将VR内容从Windows服务器流式传输到XR客户端设备, 使相对性能低的VR客户端可…

c++(多态)

多态的定义 多态是⼀个继承关系的下的类对象&#xff0c;去调⽤同⼀函数&#xff0c;产⽣了不同的⾏为 ⽐如Student继承了Person。Person对象买票全价&#xff0c;Student对象优惠买票。 多态实现的条件 • 必须指针或者引⽤调⽤虚函数 第⼀必须是基类的指针或引⽤&#xff0c;…

性能测试-JMeter(1)

性能测试工具 主流性能测试工具LoadrunnerJMeter JMeter环境安装JMeter功能概要JDK常用文件目录介绍JMeter元件和组件介绍元件的基本介绍组件的基本介绍 JMeter元件作用域和执行顺序JMeter第一个案例线程组HTTP请求查看结果树 JMeter参数化&#xff08;重点&#xff09;用户定义…

涛思数据库安装和卸载

安装 cd opt/taos/TDengine-server-2.4.0.5 sudo ./install.sh 启动taos​ 安装后&#xff0c;请使用 systemctl 命令来启动 TDengine 的服务进程 systemctl start taosd检查服务是否正常工作&#xff1a; systemctl status taosd 升级 3.0 版在之前版本的基础上&#x…

Vue3 集成 json-editor-vue3

简介 快速编辑json数据&#xff0c;还需要支持全屏编辑&#xff0c;以及json校验。 https://github.com/guyue88/json-editor-vue3 安装依赖 npm install json-editor-vue3 --save 引入 在 main.js中添加 import “jsoneditor”; 全局引入 import Vue from vue import Json…

无人自助超市系统小程序源码开发

随着科技的飞速发展和消费模式的转变&#xff0c;无人自助超市作为一种新兴的商业模式&#xff0c;以其便捷性、高效率以及对“体验式购物”的完美诠释&#xff0c;受到了广泛关注。本文renxb001将深入探讨无人自助超市系统小程序源码开发的核心环节和技术要点。 一、系统需求分…

Electron构建桌面应用程序,服务于项目的自主学习记录(持续更新...

无所畏惧地面对未知&#xff0c;并将其视为成长的机会 大纲官网快速入门1.安装node.js -- 这里推荐用nvm管理2.脚手架创建3.electron 包安装到应用的开发依赖4.创建主进程(main.js)并启动项目1.创建页面2.配置main.js3.启动项目 -- 效果 进阶 -- 基于项目场景功能使用场景一&am…

近年来自动驾驶行业就业与企业需求情况

自动驾驶行业在近年来持续发展&#xff0c;就业情况和企业需求呈现出多样化和复杂化的趋势。 以下是基于我搜索到的资料对自动驾驶行业最新就业情况和企业需求的详细分析&#xff1a; 自动驾驶行业对高端技术人才的需求非常旺盛&#xff0c;尤其是架构工程师、算法工程师等岗…

某乎登录加密以及zseck加密逆向

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 某乎的登录除了需要通过网易易盾外,登录还需要传额外的加密data参数,某盾的加密可以看我之前的文章,这里着重讲解登录以及后续ck的加密,将最终的的登录采集代码…

通过MySQL Workbench 将 SQL Server 迁移到GreatSQL

通过MySQL Workbench 将 SQL Server 迁移到GreatSQL 一、概述 MySQL Workbench 提供了可以将Microsoft SQL Server的表结构和数据迁移到 GreatSQL 的功能&#xff0c;此次将通过MySQL Workbench将SQL Server的数据迁移到GreatSQL。 本文章只是简单演示一下单张表的迁移&…

【LeetCode】每日一题 2024_10_8 旅行终点站(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 国庆结束了 . . . 力扣的每日一题也来到了终点站 题目&#xff1a;旅行终点站 代码与解题思路 func destCity(paths [][]string) string { // 国庆结束&#xff0c;旅途到了终点// 今天这道题算是一个小…

【LeetCode: 1870. 准时到达的列车最小时速 | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

看门狗电路设计

看门狗电路设计 看门狗是什么应用架构图TPV6823芯片功能硬件时序图为什么要一般是要保持200个毫秒左右的这种低电平的时间看门狗电路实际应用与条件 看门狗是什么 硬件看门狗芯片&#xff0c;Watch DogTimer&#xff0c;可用于受到电气噪音、电源故障、静电放电等影响(造成软件…