string接口的深度理解(内附思维导图)

1. 为什么学习string类?

 C语言中的字符串

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户 自己管理,稍不留神可能还会越界访问。

c++string类

http://string类的文档介绍

提供了对类对象的支持,且设计了对于单个字节的字符串中的字符进行操作。

注意⚠️:在使用string类时,必须包含#include头文件以及using namespace std;

2 string类的常用接口说明

1. string类对象的常见构造

默认 (1)
string();
构造空的string类对象,即空字符串 
拷贝 (2)
string (const string& str);
拷贝构造函数 
子字符串 (3)
string (const string& str, size_t pos, size_t len = npos);
从字符位置pos开始并跨越len字符的str部分
从 c-string (4)
string (const char* s);
用C-string来构造string类对象 
 (5)
string (const char* s, size_t n);
从s指向的字符数组中复制前n个字符。
 (6)
string (size_t n, char c);
string类对象中包含n个字符c ,c可以的字符,也可以是ask码值。
范围 (7)
template <class InputIterator>  string  (InputIterator first, InputIterator last);
范围构造函数以相同的顺序复制范围中的字符序列[第一个,最后一个]

#include <iostream>
#include <string>int main()
{std::string s0("Initial string");// 构造函数的使用顺序与上述相同:std::string s1;std::string s2(s0);std::string s3(s0, 8, 3);std::string s4("A character sequence");std::string s5("Another character sequence", 12);std::string s6a(10, 'x');std::string s6b(10, 66);      // 66 is the ASCII code for 'B'std::string s7(s0.begin(), s0.begin() + 7);std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';return 0;
}

 

 2. string类对象的容量操作

2.size 重要

返回字符串的长度,单位为字节。
这是符合字符串内容的实际字节数,它不一定等于它的存储容量。

#include <iostream>
#include <string>int main()
{std::string str("Test string");std::cout << "str 的大小是" << str.size() << " 字节\n";return 0;
}

 3.length重要

返回字符串的长度,单位为字节。
这是符合字符串内容的实际字节数,它不一定等于它的存储容量。

#include <iostream>
#include <string>int main()
{std::string str("Test string");std::cout << "str 的大小是" << str.length() << " 字节\n";return 0;
}

注意⚠️:size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接 口保持一致,一般情况下基本都是用size()。

 3.capacity

返回当前为该字符串分配的存储空间大小,以字节表示。

这个容量不一定等于字符串长度。它可以等于或大于,额外的空格允许对象在向字符串中添加新字符时优化itsl操作。

扩展

请注意,这个容量没有限制字符串的长度。当该容量耗尽,需要更多时,自动按对象进行扩容(重新分配存储空间)。字符串长度的理论极限由成员max_size给出。

#include <iostream>
#include <string>int main ()
{std::string str ("Test string");std::cout << "size: " << str.size() << "\n";std::cout << "length: " << str.length() << "\n";std::cout << "capacity: " << str.capacity() << "\n";std::cout << "max_size: " << str.max_size() << "\n";return 0;
}

4.resize  (调整)重要

 将有效字符的个数该成n个,多出的空间用字符c填充

#include <iostream>
#include <string>int main()
{std::string str("I like to code in C");std::cout << str << '\n';unsigned sz = str.size();str.resize(sz + 2, '+');std::cout << str << '\n';str.resize(14);std::cout << str << '\n';return 0;
}

3. string类对象的访问及遍历操作

3.1 operator[](重 点)

这样写const 我之前博客中有

返回pos位置的字符,const string类对象调用

#include <iostream>
#include <string>int main()
{std::string str("Test string");for (int i = 0; i < str.length(); ++i){std::cout << str[i];}return 0;
}

 3.2 begin + end

begin获取一个字符的迭代器 + end获取最后一个字符下一个位 置的迭代器

3.3rbegin + rend

 begin获取一个字符的迭代器 + end获取最后一个字符下一个位 置的迭代器

细节讲解在operator[ ]和迭代器,auto,for流,reserve-CSDN博客

 4. string类对象的修改操作

4.1push_back  

在字符串后尾插字符c

#include <iostream>
#include <string>int main()
{std::string str("Test string");str.push_back(6);std::cout << str;return 0;
}

4.2 append 

在字符串后追加一个字符串

#include <iostream>
#include <string>int main()
{std::string str;std::string str2 = "Writing ";std::string str3 = "print 10 and then 5 more";// used in the same order as described above:str.append(str2);                       // "Writing "str.append(str3, 6, 3);                   // "10 "str.append("dots are cool", 5);          // "dots "str.append("here: ");                   // "here: "str.append(10u, '.');                    // ".........."str.append(str3.begin() + 8, str3.end());  // " and then 5 more"std::cout << str << '\n';return 0;
}

4.3 operator+= (重 点)

在字符串后追加字符串str

// string::operator+=
#include <iostream>
#include <string>int main ()
{std::string name ("John");std::string family ("Smith");name += " K. ";         // c-stringname += family;         // stringname += '\n';           // characterstd::cout << name;return 0;
}

4.4  c_str (重 点)

返回C格式字符串


#include <iostream>
#include <cstring>
#include <string>int main()
{std::string str("Please split this sentence into tokens");char* cstr = new char[str.length() + 1];std::strcpy(cstr, str.c_str());// cstr now contains a c-string copy of strchar* p = std::strtok(cstr, " ");while (p != 0){std::cout << p << '\n';p = std::strtok(NULL, " ");}delete[] cstr;return 0;
}

4.5 find+npos(重 点)

从字符串pos位置开始往后找字符c,返回该字符在字符串中的 位置

5. string类非成员函数(操作符)

5.1  operator+

尽量少用,因为传值返回,导致深拷贝效率低

#include <iostream>
#include <string>int main()
{std::string firstlevel("com");std::string secondlevel("cplusplus");std::string scheme("http://");std::string hostname;std::string url;hostname = "www." + secondlevel + '.' + firstlevel;url = scheme + hostname;std::cout << url << '\n';return 0;
}

5.2 operator>> (重点)

输入运算符重载

//提取操作符
#include <iostream>
#include <string>main()
{std::string name;std::cout << "Please, enter your name: ";std::cin >> name;std::cout << "Hello, " << name << "!\n";return 0;
}

5.3 perator <<(重点)

输出运算符重载

#include <iostream>
#include <string>int main()
{std::string str = "Hello world!";std::cout << str << '\n';return 0;
}

5.4 getline (重点)

获取一行字符串

#include <iostream>
#include <string>int main()
{std::string name;std::cout << "Please, enter your full name: ";std::getline(std::cin, name);std::cout << "Hello, " << name << "!\n";return 0;
}

5.5 relational operators (重点)

大小比较

#include <iostream>
#include <vector>int main ()
{std::string foo = "alpha";std::string bar = "beta";if (foo==bar) std::cout << "foo 和 bar are 相等\n";if (foo!=bar) std::cout << "foo 和 bar are 不相等\n";if (foo< bar) std::cout << "foo 小于 less \n";if (foo> bar) std::cout << "foo 大于 greater \n";if (foo<=bar) std::cout << "foo 小于等于 less \n";if (foo>=bar) std::cout << "foo 大于等于 greater\n";return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…

jsp+sevlet+mysql实现用户登陆和增删改查功能

jspsevletmysql实现用户登陆和增删改查功能 一、系统介绍二、功能展示1.用户登陆2.用户列表3.查询用户信息4.添加用户信息5.修改用户信息6.删除用户信息 四、其它1.其他系统实现 一、系统介绍 系统主要功能&#xff1a; 用户登陆、添加用户、查询用户、修改用户、删除用户 二…

Python小白学习教程从入门到入坑------第二十九课 访问模式文件定位操作(语法进阶)

一、访问模式 模式可做操作若文件不存在是否覆盖r只能读报错-r可读可写报错是w只能写创建是w可读可写创建是a只能写创建否&#xff0c;追加写a可读可写创建否&#xff0c;追加写 1.1 r r&#xff1a;只读模式(默认模式)&#xff0c;文件必须存在&#xff0c;不存在就会报错…

TIOBE 编程指数 11 月排行榜公布 VB.Net第九

IT之家 11 月 9 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#xff0c;今天 TIOBE 官网公布了 2024 年 11 月的编程语言排行榜&#xff0c;IT之家整理如下&#xff1a; P…

聚合联盟的优势

聚合广告联盟对比其他平台优势&#xff1a; 数据透明&#xff0c;自己去平台查看不存在扣量问题。对OVHM做策略优化&#xff0c;帮助开发者做多重点击和下载&#xff0c;使开发者利益最大化。为开发者提供app各大市场上架&#xff0c;隐私协议等指导。 最大的优势就是数据公开…

FakeLocation 版本问题

前言:最新版的FakeLocation 1.3.5 BETA版本在appconfigs.xml文件种添加了绝大多数的应用,导致会返回真实的物理位置&#xff0c;在1.3.2.2都没有这个问题&#xff0c;但是旧版是会被强制更新&#xff0c;不然无法使用. 版本问题/注入/代理 方法 需要使用FakeLocation有二种办法…

算法(第一周)

一周周五&#xff0c;总结一下本周的算法学习&#xff0c;从本周开始重新学习许久未见的算法&#xff0c;当然不同于大一时使用的 C 语言以及做过的简单题&#xff0c;现在是每天一题 C 和 JavaScript&#xff08;还在学&#xff0c;目前只写了一题&#xff09; 题单是代码随想…

大语言模型LLMs在医学领域的最新进展总结

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 相比其他学科&#xff0c;医学AI&#xff0c;是发表学术成果最多的领域。 医学数据的多样性和复杂性&#xff08;包括文本、图像、基因组数据等&#xff09;&#xff0c;使得…

服务器被病毒入侵如何彻底清除?

当服务器遭遇病毒入侵时&#xff0c;彻底清除病毒是确保系统安全和数据完整性的关键步骤。这一过程不仅需要技术上的精准操作&#xff0c;还需要严密的计划、合理的资源调配以及后续的防范措施。以下是一篇关于如何在服务器被病毒入侵时彻底清除病毒的详细指南。 一、初步响应与…

Javascript中如何实现函数缓存?函数缓存有哪些应用场景?

#一、是什么 函数缓存&#xff0c;就是将函数运算过的结果进行缓存 本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象 解释 const add (a,b) > ab; const calc memoize(add); // 函数缓存…

基于LLaMA-Factory微调Llama3

本文简要介绍下基于LLaMA-Factory的llama3 8B模型的微调过程 环境配置 # 1. 安装py3.10虚拟环境 conda create -n py3.10-torch2.2 python3.10 source activate conda activate py3.10-torch2.2# 2. 安装cuda12.2 gpu版torch2.2 conda install pytorch2.2.2 torchvision0.17.…

学习记录:js算法(九十):N皇后

文章目录 N 皇后思路一 N 皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇…

RTC精度及校准

RTC精度偏差&#xff1a; RTC的基准时间和精度与石英晶体的频率相关&#xff0c;晶体的谐振频率取决于温度&#xff0c;因此RTC性能与温度相关&#xff0c;晶体的频率偏差是晶体正常频率的温度反转函数。 一、硬件方面&#xff1a; 1.使用高精度振荡器的RTC模块&#xff1b; …

Axure PR 9 多级下拉选择器 设计交互

​ 大家好&#xff0c;我是大明同学。 Axure选择器是一种在交互设计中常用的组件&#xff0c;这期内容&#xff0c;我们来探讨Axure中多级下拉选择器设计与交互技巧。 下拉列表选择输入框元件 创建选择输入框所需的元件 1.在元件库中拖出一个矩形元件。 2.选中矩形元件&…

【设计模式系列】享元模式(十五)

目录 一、什么是享元模式 二、享元模式的角色 三、享元模式的典型应用场景 四、享元模式在ThreadPoolExecutor中的应用 1. 享元对象&#xff08;Flyweight&#xff09;- 工作线程&#xff08;Worker&#xff09; 2. 享元工厂&#xff08;Flyweight Factory&#xff09;- …

LeetCode热题100之贪心算法

1.买卖股票的最佳时机 思路分析&#xff1a;即需要找出某一天的最低价格和它后面几天的最高价格差。 维护一个变量min_price&#xff0c;表示到目前为止遇到的最低股票价格&#xff1b;遍历prices数组&#xff0c;在每一天的价格上&#xff1a; 更新min_price为当前的价格和mi…

git 对已提交的说明进行编辑

如果提交代码的时候&#xff0c;对上次提交代码的说明不准确的话&#xff0c;例如 1、可以使用 git log 查看代码提交的记录&#xff1b; 2、使用 git commit --amend 命令对上次提交的说明进行编辑&#xff1a; 当显示上次提交的内容的时候&#xff0c;按下键盘 i 键即可编辑…

Hive简介 | 体系结构

Hive简介 Hive 是一个框架&#xff0c;可以通过编写sql的方式&#xff0c;自动的编译为MR任务的一个工具。 在这个世界上&#xff0c;会写SQL的人远远大于会写java代码的人&#xff0c;所以假如可以将MR通过sql实现&#xff0c;这个将是一个巨大的市场&#xff0c;FaceBook就这…

四期书生大模型实战营(【基础岛】- 第1关 | 书生·浦语大模型开源开放体系)

文章目录 1. 性能提升、推理能力领先1.1. 书生浦语开源时间线1.1.1. 时间节点1.1.2. InternLM性能天梯 1.2. 模型亮点1.2.1. 推理能力1.2.2. 长文本支持1.2.3. 复杂任务的自动规划与搜索 1.3. 核心技术思路 2. 支持多模态预训练与微调2.1. 开源模型谱系2.2. 核心优势 3. 书生浦…

python之正则表达式总结

正则表达式 对于正则表达式的学习&#xff0c;我整理了网上的一些资料&#xff0c;希望可以帮助到各位&#xff01;&#xff01;&#xff01; 我们可以使用正则表达式来定义字符串的匹配模式&#xff0c;即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与…