【C++初阶】string 类的认识与学习

简介: 【C++初阶】string 类的认识与学习

 

在学习string类之前,先在这里推荐2个好用的网站,可以用来查阅C++的相关知识

https://cplusplus.com

https://en.cppreference.com/w/

上面的是非官方的,下面的官方的,但是个人感觉还是上面的好用。

一.string 类是什么

简单来说,string 是C++中用来管理字符串的类。

他有很多接口,大致分为:

1.string类对象的构造

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

3.string类对象的容量操作

4. string类对象的修改操作

5.string类非成员函数

下面开始介绍。


二.string类对象的构造

可以看到,库里一共有7种构造方式,但我们常用的是(1),(2),(4),其它并不怎么用,如果想要了解的话,可以自行查看文档。

1. int main()
2. {
3.     string s1;  //不初始化(1)
4. string s2("hello world");  //常量字符串初始化 (2)
5. string s3(s2);   //string 类型初始化  (4)
6. 
7. return  0;
8. }

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

库里重载了 [] 运算符,这就允许我们可以像C语言中一样,用 [] 加下标的方式访问string类对象。

string类的遍历有很多种方法:

1.像C语言中数组的遍历方式

1. string s("hello world");
2. for (int i = 0; i < s.size(); i++)
3.     {
4.         cout << s[i] << endl;
5.     }

2.范围for

1. for (auto ch : s)
2.     {
3.         cout << ch<< endl;
4.     }

注意范围for只能正向遍历

3.迭代器  iterator

1.     std::string::iterator it = s.begin();
2. while (it != s.end())
3.     {
4.         cout << *it << endl;
5.         it++;
6.     }

迭代器是封装在string类里面的,所以要以上述方式使用。

迭代器是像指针一样的类型,但并不完全是指针,它提供了一种统一的方式修改和访问容器的数据,不像前两种方式需要是数组,且范围for是用迭代器实现的。

迭代器有很多接口:

rbegin和rend是反向迭代器的接口,后面的4个并不常用,就不做过多介绍了 。


四.string类对象的容量操作

size和lengh的功能差不多,但还是推荐用size;

resize可以设置size,如果你设置的比你实际的有效数据小,则多的会被舍弃

reserve可以设置capacity,但他实际设置的空间,比你预想的要大

如果想要用reserve实现缩容的操作,则需要先清空有效数据,否则无效


五.string类对象的修改操作

库里提供很多修改string类对象的接口,但我们最常用,用的最爽的还是 += ,这个清楚明了,你不用担心它的容量问题,它会自动扩容的

它支持string类对象,常量字符串,字符

下面再介绍几个常用的:

find与rfind

find可以在一个字符串中从pos处开始寻找字符或是字符串,并返回第一个与之匹配的下标 ,如果没有找到,则返回npos,npos的值其实是-1

rfind顾名思义,就是反向查找,功能和find还是一样的。

substr

截取从 pos 到 len 的子串

例:分离一个网址的协议,域名和资源

1. int main()
2. {
3.  string ur = "https://tsunagarujp.bunka.go.jp/level02/b13";
4. 
5.  size_t pos1= ur.find("://");
6.  string protocol;  //协议
7.  string domain;  //域名
8.  string uri;   //资源
9. 
10.   protocol = ur.substr(0, pos1);
11.   cout << protocol << endl;
12.   size_t pos2 = ur.find("/",pos1+3);
13.   domain = ur.substr(pos1 + 3, pos2 - pos1 - 3);
14.   cout << domain << endl;
15.   uri = ur.substr(pos2 + 1);
16.   cout << uri << endl;
17. 
18.   return 0;
19. 
20. 
21. }

c_str

返回string类中字符串的地址,因为string类既包括了字符串,也包括了size,capacity这些变量,有时为了更好的配合C语言,会使用这个函数。

请看例题:

1. //以下代码的运行结果是什么?
2. int main()
3. {
4. 
5.  string a="hello world";
6.  string b=a;
7.  if (a.c_str()==b.c_str())
8.         cout<<"true"<<endl;
9. else
10.         cout<<"false"<<endl;
11. 
12.     string c=b;
13.     c="";
14. if (a.c_str()==b.c_str())
15.         cout<<"true"<<endl;
16. else
17.         cout<<"false"<<endl;
18. 
19.   a="";
20. if (a.c_str()==b.c_str())
21.     cout<<"true"<<endl;
22. else
23.         cout<<"false"<<endl;
24. 
25.   return 0;
26. 
27. }
28.

答案:false  false  false

getline

获取一行字符串(包括空格)

这个就弥补了cin>> 的不足,cin>> 是遇到空格就停止读取了。


🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼


目录
相关文章
|
6天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
29 5
|
12天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
40 4
|
13天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
38 4
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
57 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
28天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
1月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
26 2
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
25 4
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
22 1
|
1月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
52 4