【C++】std::string和size()函数进阶解析

news2025/1/12 18:50:00

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯基础知识:C++ 中的std::string
    • 字符串的基础概念
    • `size()` 函数基础
    • 使用size()实例:计算字符串长度
  • 💯基于size()的字符串解析和访问方式
    • 代码实现:通过下标访问字符串
    • size() 与下标访问的优化功能
  • 💯进阶拓展:字符串的通过变量访问和更深操作
    • 通过迭代器访问
    • at()函数和字符检查
  • 💯小结


在这里插入图片描述


💯前言

  • C++ 中的 std::string 提供了一种高效且简单的方式来操作字符串,不仅可以进行轻松的字符串连接,还能完成长度计算、字符访问和后缀处理等处理任务。本文将优化精进地分析 C++ 中的 std::string 和其采用的常见函数,尤其是 size() 函数,并提供相关优化解释和知识拓展。
    C++ 参考手册
    在这里插入图片描述

💯基础知识:C++ 中的std::string

字符串的基础概念

C++ 中, std::string 是一种是封装类,能夠提供对字符串进行操作的简单方式。和传统的 C 风格字符串(char[])相比,它更加高效和安全,提供了丰富的语法支持。

典型例如:

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

int main() {
    string s1 = "hello";
    string s2 = "world";
    string s3 = s1 + " " + s2; // 字符串相连

    cout << s3 << endl; // 输出:hello world
    return 0;
}

上面过程体现了 C++ 字符串的连接功能,显示了它的自然语法背后的高效。

size() 函数基础

在字符串操作中,实现字符串长度计算是一项基础而重要的功能。C++ 中的 std::string 提供了两个全程等任的函数:size()length(),它们用于计算字符串的长度,返回字符串中的字符数量。

例如:

string s = "hello";
cout << s.size() << endl;    // 输出:5
cout << s.length() << endl; // 输出:5

注意:size()length() 是等任的,可以任意使用任一个。

使用size()实例:计算字符串长度

在下面这段代码中,实现了通过 size() 函数来计算一些不同内容字符串的长度。

代码:

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

int main() {
    string s;               // 完全空字符串
    string s1 = "hello";   // 有 5 个字符
    string s2 = "hello world"; // 包含空格共 11 个字符
    string s3 = "12lab!~ ";    // 包括空格共 14 个字符

    cout << "s:" << s.size() << endl;
    cout << "s1:" << s1.size() << endl;
    cout << "s2:" << s2.size() << endl;
    cout << "s3:" << s3.size() << endl;

    return 0;
}

运行结果:

s:0
s1:5
s2:11
s3:14

分析:

  1. 空字符串: 字符串 s 为空,因此返回长度 0。
  2. 普通字符串: 字符串 s1 包含 5 个字符,因此返回长度 5。
  3. 包含空格: 字符串 s2 含有一个空格,因此返回总长度 11。
  4. 包括空格和符号: s3 包含多种符号和空格,返回总长度 14。

从运行结果可以看出,size() 会正确计算字符串中的字符总数,包括字母、数字,空格,和其他符号。


💯基于size()的字符串解析和访问方式

代码实现:通过下标访问字符串

C++ 允许通过下标访问字符串中的单个字符:

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

int main() {
    string s = "abcdef";
    for (int i = 0; i < s.size(); i++) {
        cout << s[i] << " "; // 通过下标访问字符,并传递打印
    }
    return 0;
}

运行结果:

a b c d e f

分析:

  1. 输出格式: 通过下标访问,字符串中每个字符都被单独打印,字符之间用空格分隔。
  2. 转到下标操作: 从 0 起始,直到 size() 返回的长度为止,通过下标每次选取字符。

size() 与下标访问的优化功能

通过下标访问和 size() 相结合,可以高效地进行字符级的解析:

  1. 选取指定字符串内的字符。
  2. 配合算法,进行字符级计算。

例如:给定字符串,计算其中大写字母的总数:

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

int main() {
    string s = "HelloWorld123";
    int count = 0;

    for (int i = 0; i < s.size(); i++) {
        if (isupper(s[i])) {
            count++;
        }
    }

    cout << "Number of uppercase letters: " << count << endl;
    return 0;
}

运行结果:

Number of uppercase letters: 2

💯进阶拓展:字符串的通过变量访问和更深操作

通过迭代器访问

std::string 还允许通过迭代器实现字符的访问:

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

int main() {
    string s = "abcdef";
    for (auto it = s.begin(); it != s.end(); ++it) {
        cout << *it << " ";
    }
    return 0;
}

运行结果:

a b c d e f

at()函数和字符检查

at() 函数会对下标进行范围检查,能够更好地确保安全:

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

int main() {
    string s = "abcdef";
    try {
        cout << s.at(0) << endl; // 正常输出第一个字符
        cout << s.at(10) << endl; // 越界,抛出异常
    } catch (out_of_range &e) {
        cout << "Exception: " << e.what() << endl;
    }
    return 0;
}

运行结果:

a
Exception: basic_string::at: __n (which is 10) >= this->size() (which is 6)

分析:

  • s.at(0) 正常返回第一个字符。
  • s.at(10) 超出范围,抛出 out_of_range 异常,确保程序不会因为非法访问崩溃。

💯小结

本文从基础到进阶详细解析了 C++ 中 std::string 的功能,尤其是 size() 函数的应用及其与下标访问、迭代器、at() 方法的结合使用。同时补充了许多进阶拓展内容,包括安全性检查和高效字符串操作的实践。通过这些知识点,相信读者能够更加灵活、高效、安全地处理 C++ 字符串操作。如果对某些部分有疑问或需要更深入的探讨,可以进一步结合具体场景和实践需求展开!


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

学习 C++ 的建议

学习 C++ 是一项非常有价值的技能,但由于 C++ 是一门复杂且功能丰富的编程语言,它的学习过程可能会充满挑战。以下是一些关于学习 C++ 的详细建议,可以帮助你更有效地掌握这门语言:


1. 掌握基础知识

  • 了解 C++ 的核心特性:从变量、数据类型、循环、条件语句、函数等基本概念开始。这些是编写任何程序的基础。建议在学习过程中使用小的代码片段来巩固知识,例如写一个简单的计算器或者输出九九乘法表。
  • 理解指针和内存管理:指针是 C++ 的核心,同时也是初学者最大的难点之一。学习指针的定义、使用和内存分配(如 newdelete),以及如何避免内存泄漏。通过实践,熟悉指针的应用场景。
  • 学习面向对象编程 (OOP):C++ 是一门强大的面向对象编程语言,理解类、对象、继承、多态和封装是关键。这些特性不仅是 C++ 的核心,也是很多现代编程语言的基础。

2. 从 C 风格到 C++ 风格

  • 理解 C 风格的编程:如字符数组、结构体等,以及如何用 C++ 的标准库(如 stringvector)替代这些传统做法。通过比较和实践,逐渐转变为更高效和安全的 C++ 风格。
  • 熟悉标准模板库 (STL):STL 是 C++ 的一大亮点,学习常用容器(如 vectorlistmap)、算法(如 sortfind)和迭代器。通过练习解决实际问题(如排序和搜索),掌握 STL 的灵活使用。

3. 注重实践

  • 写代码解决实际问题:仅仅阅读书籍或教程是不够的,学习 C++ 最好的方法是多写代码。例如,尝试实现一个简单的银行账户管理系统、一个学生成绩管理系统,甚至尝试写一个小游戏。
  • 挑战算法和数据结构:通过实现链表、二叉树、栈、队列等基础数据结构,巩固对指针、动态内存分配的理解。同时练习一些基础算法,如排序算法、搜索算法等。
  • 参与开源项目或比赛:寻找适合自己的开源项目,通过实际开发来掌握 C++ 的最佳实践;或者参加编程比赛(如 LeetCode、Codeforces)锻炼算法能力。

4. 学习高级特性

  • 了解模板编程:C++ 的模板功能非常强大,学习如何编写模板类和模板函数。进一步探索元编程(template metaprogramming)。
  • 深入理解多态和虚函数:掌握动态多态的实现原理(如虚函数表),了解 C++ 中的抽象类和接口的设计。
  • 学习 C++11/14/17/20 的新特性:现代 C++ 提供了大量的新功能,如 autolambda 表达式、智能指针(shared_ptrunique_ptr)、std::movestd::thread 等。掌握这些特性可以让你的代码更简洁高效。

5. 重视调试和工具使用

  • 学会使用调试工具:熟悉调试器(如 gdb、Visual Studio Debugger)可以帮助你快速定位和修复问题。
  • 理解常见错误:如段错误(segmentation fault)、未初始化变量、内存泄漏等问题,并学习如何通过工具(如 Valgrind)检测和修复。
  • 熟悉开发环境:选择适合自己的 IDE(如 Visual Studio、CLion)或编辑器(如 VSCode、Vim),并掌握如何配置编译器(如 g++)。

6. 建立良好的编程习惯

  • 编写清晰的代码:遵循一致的代码风格,添加注释,使用有意义的变量名和函数名,让代码更易于阅读和维护。
  • 注重效率和优化:了解 C++ 的性能特点,尽量减少不必要的拷贝操作,使用引用(&)和指针,掌握时间复杂度和空间复杂度的分析。
  • 学习测试:编写单元测试和断言,确保程序的可靠性。

7. 寻找资源与社区支持

  • 学习资源
    • 经典书籍:《C++ Primer》《Effective C++》《The C++ Programming Language》。
    • 在线教程和课程:如 Codecademy、Coursera、YouTube 视频。
  • 加入社区:参与 C++ 开发者论坛(如 StackOverflow)、Reddit 社区,或加入 Discord/微信群讨论问题。
  • 提问与思考:在学习过程中大胆提问,同时思考问题的本质,例如“为什么要使用虚函数”“STL 的底层是如何实现的”等。

8. 循序渐进,持续学习

  • C++ 是一门博大精深的语言,不要期望一蹴而就。可以从基础的命令行程序开始,再逐步学习复杂的特性。
  • 制定学习计划,例如每天解决一两个问题、每周完成一个小项目。持之以恒是掌握 C++ 的关键。
  • 学习其他语言并反哺 C++:如 Python 的快速开发体验、Rust 的内存安全理念,都可以为 C++ 的学习提供新视角。

总结
学习 C++ 是一个不断探索和实践的过程,从基础知识到高级特性,再到性能优化和实际应用,逐步构建起对这门语言的全面理解。关键在于动手实践、深入思考,并不断接受挑战。通过不断的练习和总结,你会发现 C++ 的强大和灵活,能够用它解决各种复杂问题,为你的编程之路打下坚实的基础。加油!


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像&#xff0c;预处理找到数字边框使用模版匹配&#xff0c;计算匹配得分 画出并打印结果 项目任务及要求 任务书&#xff1a; 要为某家银行设计一套…

【开发环境搭建篇】Visual Studio 2022 安装和使用

本文收录于 《C编程入门》专栏&#xff0c;从零基础开始&#xff0c;介绍C编程入门相关的内容&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、下载三、安装四、使用五、总结 一、前言 本文介绍如何在Windows环境下安装Visual Studio 2022。 什么是Vi…

【面试题】技术场景 5、日志采集ELK

日志采集的重要性与采集方式 重要性&#xff1a;在项目开发、测试及生产环境中&#xff0c;日志是定位系统问题的关键手段&#xff0c;对系统维护与问题排查至关重要。采集方式 常规采集&#xff1a;按天保存日志文件至专门目录&#xff0c;文件名包含项目名、端口及日期&…

matlab的绘图的标题中(title)添加标量以及格式化输出

有时候我们需要在matlab绘制的图像的标题中添加一些变量&#xff0c;这样在修改某些参数后&#xff0c;标题会跟着一块儿变。可以采用如下的方法&#xff1a; x -10:0.1:10; %x轴的范围 mu 0; %均值 sigma 1; %标准差 y normpdf(x,mu,sigma); %使用normpdf函数生成高斯函数…

element plus 使用 upload 组件达到上传数量限制时隐藏上传按钮

最近在重构项目&#xff0c;使用了 element plus UI框架&#xff0c;有个功能是实现图片上传&#xff0c;且限制只能上传一张图片&#xff0c;结果&#xff0c;发现&#xff0c;可以限制只上传一张图片&#xff0c;但是上传按钮还在&#xff0c;如图&#xff1a; 解决办法&…

简单说一下 类

类的定义 类是用来对一个实体&#xff08;对象&#xff09;进行描述&#xff0c;类就是用来描述这个对象具有一些什么属性。 类的定义格式 //创建类 class ClassName{ field; //简单概述为字段(属性)或者成员变量 method; //简单概述为行为或者是成员方法 } cl…

HOW - Form 表单 label 和 wrapper 对齐场景

一、背景 在日常使用 表单 时&#xff0c;我们一般有如下布局&#xff1a; 可以通过 Form 表单提供的配置直接设置&#xff1a; <Formform{form}labelCol{{ span: 4 }}wrapperCol{{ span: 20 }}onFinish{handleSubmit}><Form.Itemlabel"输入框"name"…

01 Oracle自学环境搭建(Windows系统)

1 Oracle12C安装 1.1 下载 官网地址&#xff1a;https://www.oracle.com/ 进入官网→Resource→Customer Downloads 如果没有登录&#xff0c;会提示登录后后才能下载 选择适合自己的版本&#xff08;我电脑是Windows系统 64位&#xff09; 选择需要的安装包进行下载 双击下载…

vue el-table 数据变化后,高度渲染问题

场景&#xff1a;el-table设置了height属性&#xff0c;但是切换查询条件后再次点击查询重新获取data时&#xff0c;el-table渲染的高度会有问题&#xff0c;滚动区域变矮了。 解决办法&#xff1a;使用doLayout方法‌&#xff0c;在表格数据渲染后调用doLayout方法可以重新布局…

vue3+ts+element-plus 输入框el-input设置背景颜色

普通情况&#xff1a; 组件内容&#xff1a; <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置&#xff1a; ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…

【漫话机器学习系列】044.热点对特性的影响(Effect Of One Hot On Feature Importance)

热点对特性的重要性影响&#xff08;Effect of One-Hot Encoding on Feature Importance&#xff09; 一热编码&#xff08;One-Hot Encoding&#xff09; 是处理类别型数据的常用方法&#xff0c;将每个类别特征转换为一组独立的二进制特征。这种方法在提高模型处理非数值数据…

使用MATLAB正则表达式从文本文件中提取数据

使用MATLAB正则表达式从文本文件中提取数据 使用Python正则表达式从文本文件中提取数据的代码请看这篇文章使用正则表达式读取文本数据【Python】-CSDN博客 文本数据格式 需要提取 V 后面的数据, 并绘制出曲线. index 1V 0.000000W 0.000000E_theta 0.000000UINV 0.0…

JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南

1、简述 在现代Web开发中&#xff0c;安全性尤为重要。为了确保用户的身份&#xff0c;JSON Web Token&#xff08;JWT&#xff09;作为一种轻量级且无状态的身份验证方案&#xff0c;广泛应用于微服务和分布式系统中。本篇博客将讲解如何在Spring Boot 中集成JWT实现身份验证…

PHP进阶-在Ubuntu上搭建LAMP环境教程

本文将为您提供一个在Ubuntu服务器上搭建LAMP&#xff08;Linux, Apache, MySQL, PHP&#xff09;环境的完整指南。通过本文&#xff0c;您将学习如何安装和配置Apache、MySQL、PHP&#xff0c;并将您的PHP项目部署到服务器上。本文适用于Ubuntu 20.04及更高版本。 一、系统更新…

【算法】一阶低通滤波

目录 1.背景 2.推导 2.1基础知识 2.2 公式推导 3.截止频率 3.怎么做 4.效果 1.背景 在电机的闭环过程中&#xff0c;无法避开的一点就是电流环&#xff0c;电流环需要采集电流数据&#xff0c;然后闭环输出。在电流环采集的过程中&#xff0c;数据会有很多高频噪声&#xf…

excel VBA 基础教程

这里写目录标题 快捷键选择所有有内容的地方 调试VBA录制宏&#xff0c;打开VBA开发工具录制宏,相当于excel自动写代码&#xff08;两个表格内容完全一致才可以&#xff09; 查看宏代码保持含有宏程序的文件xlsm后缀&#xff08;注意很容易有病毒&#xff09;宏文件安全设置 使…

获取IP地区

包 https://packagist.org/packages/geoip2/geoip2#v3.1.0 用composer加载包 composer require geoip2/geoip2 mmdb下载 https://github.com/P3TERX/GeoLite.mmdb?tabreadme-ov-file

嵌入式系统Linux实时化(二)Xenomai技术框架分析

Xenomai 是 Linux 内核的一个实时开发框架。它希望通过无缝地集成到Linux 环境中来给用户空间应用程序提供全面的、与接口无关的硬实时性能。Xenomai 项目始于2001年8月&#xff0c;作为一个自由软件项目&#xff0c;完全遵守GNU/Linux自由软件协议。2003 年它和RTAI项目合并推…

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…

【LeetCode】:删除回文子数组【困难】

class Solution { public:// 思考:能否用滚动数组进行优化int minimumMoves(vector<int>& arr) {// 定义状态dp[i][j]为i-j的最小步数int n arr.size();vector<vector<int>> dp(n, vector<int>(n, 1e9 7));// 可以把这 1 次理解为一种 最小操作单…