C++ —— 关于string类

news2025/1/10 20:50:17

目录

1. auto和范围for

1.1 auto关键字

1.2 范围for

2. string的三种遍历方式

3. string类的常用接口说明

3.1 成员函数

3.2 Iterators:(迭代器)

3.2.1正向迭代器和反向迭代器

3.3 Capacity(容量)

3.4 Modifiers(修饰符)

3.5 Non-member function overloads(非成员函数重载)

3.6 operator []



string文档链接:cplusplus.com/reference/string/string/?kw=stringicon-default.png?t=O83Ahttps://cplusplus.com/reference/string/string/?kw=string

在使用string类时,必须包含#include<string>头文件以及using namespace std; 


1. auto和范围for

1.1 auto关键字

aotu的价值就是用来自动赋值,自动迭代,自动判断结束,底层就是迭代器

简化代码,替换了常类型

std::map<std::string, std::string>::iterator it = dict.begin();
//简化成
auto it = dict.begin();

1.  auto类型的对象的类型是处于待定状态的,它是由初始化的内容所决定的

 auto关键字是一个占位符,编译器执行该类型对象的定义时,先根据初始化的内容的类型A开等大的空间作为该对象的空间,A再替换auto(先占位置,后替换

2. 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型或者要修改内容时则必须加上引用&


、字符赋值,自动迭代,自动判断结束
	// 底层就是迭代器
	//for (auto ch : s2)这样写是拷贝
    //修改内容要加上引用符号&
	for (auto& ch : s2)
	{
    //修改string里的值
		ch -= 2;
		cout << ch << " ";
	}
	cout << endl;

	cout << s2 << endl;

3. 当在同一行声明多个变量时,这些变量必须是相同的类型

//同为int类型,正确
auto aa = 1, bb = 2;
//类型不同,错误
auto cc = 3, dd = 4.0;

否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后会默认其他也是这个类型

4. auto不能作为函数的参数也不能给缺省值

// 不能做参数
void func2(auto a)
{}

但是可以做返回值,但是建议谨慎使用

// 可以做返回值,但是建议谨慎使用
auto func3()
{
    return 3;
}

5. auto不能直接用来声明数组

#include<iostream>
using namespace std;
int func1()
    {
        return 10;
    }
    // 不能做参数
void func2(auto a)
    {}
// 可以做返回值,但是建议谨慎使用
    auto func3()
        {
            return 3;
        }
    int main()
        {
            int a = 10;
            auto b = a;
            auto c = 'a';
            auto d = func1();
// 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
    auto e;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    cout << typeid(d).name() << endl;
    int x = 10;
    auto y = &x;
    auto* z = &x;
    auto& m = x;
    cout << typeid(x).name() << endl;
    cout << typeid(y).name() << endl;
    cout << typeid(z).name() << endl;
    auto aa = 1, bb = 2;
// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
    auto cc = 3, dd = 4.0;
// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
    auto array[] = { 4, 5, 6 };
    return 0;
}

#include<iostream>
#include <string>
#include <map>
using namespace std;
int main()
    {
        std::map<std::string, std::string> dict = { { "apple", "苹果" },{ "orange","橙子" }, {"pear","梨"} };
    // auto的用武之地
    //std::map<std::string, std::string>::iterator it = dict.begin();
    auto it = dict.begin();
    while (it != dict.end())
        {
            cout << it->first << ":" << it->second << endl;
            ++it;
        }
        return 0;
    }


1.2 范围for

1. for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束

2. 范围for的作用就是遍历数组和容器对象(主要用于容器)

// C++11的遍历
for (auto& e : array)
       e *= 2;

for (auto e : array)
cout << e << " " << endl;

加上&就可以修改其中的内容(e * = 2),如果不修改就可以不加

3. 范围for的底层就是迭代器,容器遍历实际就是替换为迭代器

#include<iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
   int array[] = { 1, 2, 3, 4, 5 };
  
   // C++11的遍历
   for (auto& e : array)
       e *= 2;
   for (auto e : array)
       cout << e << " " << endl;
   string str("hello world");
   for (auto ch : str)
  {
       cout << ch << " ";
  }
   cout << endl;
return 0;
}


2. string的三种遍历方式

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

//class string
//{
//private:
//	char _buff[16];
//	char*  _str;
//
//	size_t _size;
//	size_t _capacity;
//};



// string:: :展开string库
// iterator:迭代器
// it:使用迭代器定义的对象
// begin():返回这块空间开始位置的迭代器
// end:返回最后一个数据的下一个位置(\0)
//string::iterator it = s2.begin();
//while (it != s2.end())
//{
//
//	cout << *it << " ";
//	++it;
//}
//cout << endl;


void test_string1()
{
	string s1;
	string s2("hello world");

	cout << s1 << s2 << endl;

	s2[0] = 'x';
	cout << s1 << s2 << endl;

	//访问+修改  第一种只支持数组,不支持树或者链表
	// 1、下标 + []
	for (size_t i = 0; i < s2.size(); i++)
	{
		cout << s2[i] << " ";
	}
	cout << endl;

	// 2、迭代器  使用的偏少
	//string::iterator it = s2.begin();
	auto it = s2.begin();
	while (it != s2.end())
	{
		*it += 2;

		cout << *it << " ";
		++it;
	}
	cout << endl;

	cout << s2 << endl;



	//只是简单的遍历用第三种
	// 3、字符赋值,自动迭代,自动判断结束
	// 底层就是迭代器
	//for (auto ch : s2)
	for (auto& ch : s2)
	{
		ch -= 2;
		cout << ch << " ";
	}
	cout << endl;

	cout << s2 << endl;
}


3. string类的常用接口说明

3.1 成员函数

 

1.  constructor(构造函数):

string();
创建一个空的string对象,也就是创建一个空的字符串
string (const char* s);
以 C 当中 str 的方式 创建这个 string对象,最后以 " \0 " 结尾
string (size_t n, char c);
string类当中有 n 个 c 这个字符
string (const string& str);
拷贝构造函数
string (const string& str, size_t pos, size_t len = npos);
拷贝构造函数,从某一位置开始(pos),拷贝 len 个字符
string (const char* s, size_t n);
构造一个string 类 ,在 s 常量字符串 的前n 个字符中拷贝

 

2.destructor(析构函数):string里的析构函数是自动析构的

3. operator= (运算符=):


3.2 Iterators:(迭代器)

类似指针,但不全是指针

begin:返回一个指向字符串的第一个字符的迭代器 
end:返回最后一个数据的下一个位置(\0)
rbegin:指向的是最后一个字符的位置
rend:指向的是第一个字符的前一个位置

3.2.1正向迭代器和反向迭代器

const迭代器的特点是只能读不能写

 正向:

1. Iterators      2. const_Iterators

begin:返回一个指向字符串的第一个字符的迭代器 
end:返回最后一个数据的下一个位置(\0)

 反向迭代器:倒着遍历使用

1. reverse_Iterators      2.const_reverse_Iterators

rbegin:指向的是最后一个字符的位置
rend:指向的是第一个字符的前一个位置

void test_string2()
{
	string s2("hello world");
	string::iterator it = s2.begin();
	while (it != s2.end())
	{
		*it += 2;
		cout << *it << " ";
		++it;
	}
	cout << endl;

	string::reverse_iterator rit = s2.rbegin();
	while (rit != s2.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

	const string s3("hello world");
	//string::const_iterator cit = s3.begin();
	auto cit = s3.begin();
	while (cit != s3.end())
	{
		//*cit += 2;
		cout << *cit << " ";
		++cit;
	}
	cout << endl;

	//string::const_reverse_iterator rcit = s3.rbegin();
	auto rcit = s3.rbegin();
	while (rcit != s3.rend())
	{
		// *rcit += 2;
		cout << *rcit << " ";
		++rcit;
	}
	cout << endl;
}


3.3 Capacity(容量)

size返回字符串有效字符长度
empty 判断字符串是否为空串,是返回true,否则返回false
reserve 

提前开辟好要开辟的空间,根据计划的大小更改调整字符串容量,长度最多大于 n 个字符

如果开辟100个空间,那么实际上开辟101个空间,多的一个给\0

为字符串预留空间**

resize 将有效字符的个数该成n个,多出的空间用字符c填充 ,string部分使用的不多
clear

清空所有的数据,但是不清除容量

length返回字符串有效字符长度
capacity返回空间总大小


 

1. size与length底层实现原理完全相同,引入size的原因是因为length不具有通用性,size具有通用性,所以基本都是用size,但是length不能舍弃

2. clear只会将string中有效字符清空,不改变底层空间大小

3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不 同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变

4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参 数小于string的底层空间总大小时,reserver不会改变容量大小

 

// 测试string容量相关的接口
// size/clear/resize
void Teststring1()
{
	// 注意:string类对象支持直接用cin和cout进行输入和输出
	string s("hello, bit!!!");
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
	s.clear();
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	// 将s中有效字符个数增加到10个,多出位置用'a'进行填充
	// “aaaaaaaaaa”
	s.resize(10, 'a');
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
	// "aaaaaaaaaa\0\0\0\0\0"
	// 注意此时s中有效字符个数已经增加到15个
	s.resize(15);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中有效字符个数缩小到5个
	s.resize(5);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
}


3.4 Modifiers(修饰符)

operator+=在字符串后追加字符串str
append在字符串后追加一个字符串
push_back在字符串后尾插字符
c_str返回底层字符串的指针,兼容C语言
find+npos从字符串pos位置开始往后找字符,返回该字符在字符串中的
位置,正着找
rfind从字符串pos位置开始往前找字符,返回该字符在字符串中的
位置,倒着找
substr在str中从pos位置开始,截取n个字符,然后将其返回

// 1. 插入(拼接)方式:push_back  append  operator+= 
// 2. 正向和反向查找:find() + rfind()
// 3. 截取子串:substr()
// 4. 删除:erase
void Teststring5()
{
	string str;
	str.push_back(' ');   // 在str后插入空格
	str.append("hello");  // 在str后追加一个字符"hello"
	str += 'b';           // 在str后追加一个字符'b'   
	str += "it";          // 在str后追加一个字符串"it"
	cout << str << endl;
	cout << str.c_str() << endl;   // 以C语言的方式打印字符串

	// 获取file的后缀
	string file("string.cpp");
	size_t pos = file.rfind('.');
	string suffix(file.substr(pos, file.size() - pos));

    //suffix:后缀
	cout << suffix << endl;

	// npos是string里面的一个静态成员变量
	// static const size_t npos = -1;

	// 取出url中的域名
	string url("http://www.cplusplus.com/reference/string/string/find/");
	cout << url << endl;
	size_t start = url.find("://");
	if (start == string::npos)
	{
		cout << "invalid url" << endl;
		return;
	}
	start += 3;
	size_t finish = url.find('/', start);
	string address = url.substr(start, finish - start);
	cout << address << endl;

	// 删除url的协议前缀
	pos = url.find("://");
	url.erase(0, pos + 3);
	cout << url << endl;
}

3.5 Non-member function overloads(非成员函数重载)

operator+可以string+字符串 或者 字符串+string
operator>>输入运算符重载
operator<<输出运算符重载
getline获取一行字符串
relational operators大小比较


3.6 operator []

operator[] 在C当中 " [] " 这个操作符相当于是 解引用操作,只有在连续的空间当中才能使用这个 " [] " 这个操作符,比如在栈上开辟的数组和 堆上动态开辟的空间

那么在自定义类型string 类当中,我们也可以使用 " [] " 来访问这个字符串数组

使用 下标 + []  的方式来访问string自定义类型

	string s3("hello world");
	// 直接打s3 当中的内容
	cout << s3 << endl;
 
	// 下标 + []
	for (int i = 0; i < s3.size(); i++)
	{
		cout << s3[i];
	}
	cout << endl;
 
	return 0;

operator []返回pos位置的字符,const string类对象调用
begin+endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位
置的迭代器


                                                                   感谢观看~

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

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

相关文章

大模型微调十诫:关于将微调模型部署到生产环境的十条建议

转自;NLP工程化 大模型微调十诫&#xff1a;关于将微调模型部署到生产环境的十条建议&#xff1a; &#xff08;1&#xff09;不要盲目微调模型&#xff0c;先尝试使用提示的方式满足需求。只有当提示无法达到质量、性能或成本目标时&#xff0c;才考虑微调。 &#xff08;2…

ubuntu20.04 GLIBC从2.35降级到2.31

ubuntu20.04默认的GLIBC版本是2.31&#xff0c;因为某些库的依赖问题&#xff0c;脑子一抽把GLIBC升级到2.35&#xff0c;GLIBC升级参考一下另外一位博主的文章Ubuntu20.04更新GLIBC到2.35版本_glibc-2.35-CSDN博客 但当我想把GLIBC回退到2.31版本&#xff0c;参考网上的办法&a…

浅谈基于负荷时空均衡和弹性响应的电动汽车快充电价定价策略

摘要&#xff1a;为了引导电动汽车有序充电&#xff0c;提出了一种考虑负荷时空均衡和弹性响应的电动汽车快充电价定价策略。引入交通流理论描述交通路网&#xff0c;建立电动汽车快充负荷时空分布模型&#xff1b;考虑配电网调度和电动汽车快充负荷的弹性需求&#xff0c;构建…

【Python】从基础到进阶(七):深入理解Python中的异常处理与调试技巧

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、异常处理概述1. 什么是异常&#xff1f;2. 异常的捕获与处理 三、常见的异常类型四、自定义异常五、调试与日志记录1. 使用assert进行调试2. 使用日志记录 六、案例&#xff1a;文件操作与异常处理1. 需求分析2…

【经验技巧】瞬态信号仿真中的码型选择问题

工程师在进行通道信号仿真时&#xff0c;经常会遇到信号码型选择的问题&#xff0c;通常的码型选择有两种&#xff1a;连续周期变化、随机变化&#xff0c;那么&#xff0c;不同的码型会对结果产生截然不同的影响&#xff0c;以设计中一路差分通道为例&#xff0c;搭载信号传输…

51.【C语言】字符函数和字符串函数(strcpy函数)

承接50.【C语言】字符函数和字符串函数(上) 点我跳转 5.strcpy函数 *简单使用 cplusplus的介绍 点我跳转 strcpy:string copy 翻译: 复制字符串 复制由source指向的C字符串到由destionation指向的数组中,包括\0(终止0字符)(在\0那里停止复制) 为了防止溢出,由destionation指…

深入内核分析BindException异常原因

一、前言 前段时间公司内的站点发布时经常遇到Tomcat使用的8080端口被占用&#xff0c;导致启动报错BindException的情况。笔者参与了该问题的排查和修复&#xff0c;本文将深入Tomcat、OpenJDK、Linux内核等源码为大家讲解问题的原因以及排查过程。 报错信息 Caused by: java…

收到了大厂中秋礼盒,哪家赢了?

大家好&#xff0c;我是鸭鸭&#xff01; 中秋节越来越近啦&#xff0c;大家都收到放假通知和中秋月饼了吗&#xff1f; 各大互联网品牌大厂的中秋创意礼盒也来啦&#xff01; 字节 今年字节的中秋礼盒&#xff0c;除了广州酒家的月饼之外&#xff0c;还发了一床2m*2.3m的四…

INDEMIND:扫地机器人,仍然不够“香”

不仅需要“新花样”&#xff0c;还要搞好“基本功”。 行业祛魅&#xff0c;重啃技术战 正如所有人都知道市场会发生变化&#xff0c;但扫地机器人的陡然降温还是给大多数人上了一课。尽管到了2023年&#xff0c;市场有所复苏&#xff0c;但零售量的增长也仅为4%。一时间&…

医药|基于springboot的医药管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已…

基于vue框架的宠物管理平台的设计与实现f3193(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,医院简介,养宠知识,宠物分类,医生,预约医生,医嘱记录,宠物用品,用品分类,购买记录,供应商,宠物信息 开题报告内容 基于Vue框架的宠物管理平台的设计与实现开题报告 一、引言 随着宠物经济的兴起&#xff0c;宠物管理成为了一个日…

Win11+Ubuntu20.04双系统安装教程(避坑版)

Win11Ubuntu20.04双系统安装教程&#xff08;避坑版&#xff09; 前言系统盘制作安装Rufus系统盘制作 Windows磁盘配置移动分区&#xff08;磁盘分区时出现不连续的未分配空间需要用到&#xff0c;如果是连续的未分配空间即无需操作&#xff09;安装分区助手移动分区 安装Ubunt…

Redis的IO模型

Redis IO模型 Redis IO模型 使用的是基于 Reactor 模式的 I/O 多路复用模型。这个模型通过单线程事件循环来处理所有的客户端请求和响应。 基本模式 1. Reactor 模式 Reactor 模式是一种用于处理并发 I/O 操作的设计模式。它包含以下几个组件&#xff1a; 多路复用器&…

构建高效入学审核系统:Spring Boot解决方案

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学生入学审核系统的相关信息成为必然。开…

redis常见的数据类型?

参考&#xff1a;一文读懂Redis五种数据类型及应用场景 - 知乎 (zhihu.com) String 类型 String 类型&#xff1a;Redis 最基本的数据类型&#xff0c;它是二进制安全的&#xff0c;意味着你可以用它来存储任何类型的数据&#xff0c;如图片、序列化对象等。使用场景&#xff…

OceanBase 运维管理工具 OCP 4.x 升级:聚焦高可用、易用性及可观测性

可视化的管控平台&#xff0c;对 OceanBase 这类的分布式数据库及大规模数据的运维管理来说&#xff0c;是提升运维效率与数据库管理水平的重要工具。OceanBase 运维管理工具 OCP 作为专为OceanBase数据库设计的企业级全生命周期管理平台&#xff0c;为用户提供了全面的数据库可…

句子成分——每日一划(六)

顺手简答一划&#xff1a;And&#xff1a;连词 you&#xff1a;主语 my friend&#xff1a;插入语 you&#xff1a;对主语起强调作用 are&#xff1a;系动词 the real hero&#xff1a;表语 目录 一、原句 二、独立成分&#xff0c;状语(Adverbial Phrase) 三、条件状语从…

Leetcode面试经典150题-82.删除排序链表中的重复元素II

之前写过这个题的基础第83题&#xff0c;看本文之前一定要先看懂这个Leetcode面试经典150题-82.删除排序链表中的重复元素II前序-83.删除排序链表中的重复元素_删除链表中重复的元素-CSDN博客 直接上代码了&#xff0c;解法都在代码里&#xff0c;不懂就留言或者私信 /*** De…

电机驱动开发之驱动板

目录 1.主要器件选型2.原理图设计3.PCB绘制电源调理驱动电路电流反馈位置反馈 4.PCB绘制5.打板验证6.总结 1.主要器件选型 器件参数封装理由LDOLM317DCYR &#xff08;24V-12V 12V-5V&#xff09;SOT-223小电流应用 LDO比DCDC噪声小响应快更为稳定预驱FD6288TTssop-20常见无刷…

独立站新纪元:破局而出,共绘可持续发展蓝图

随着全球电商市场的日益繁荣与平台竞争的加剧,独立站作为商家自主掌控品牌与市场的桥头堡,正面临着前所未有的挑战与机遇。在这个瞬息万变的时代,如何在平台垄断的阴影下突围而出,实现可持续增长,成为了每一位独立站商家亟需解答的课题。为此,店匠科技( Shoplazza ) 将于 9月 2…