首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++篇】探索STL之美:熟悉使用String类

【C++篇】探索STL之美:熟悉使用String类

作者头像
熬夜学编程的小王
发布2024-11-20 20:30:30
发布2024-11-20 20:30:30
2100
举报
文章被收录于专栏:编程小王编程小王

前言

💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力! 🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!

C++ string 类从入门到精通:

1. string简介

C++ 标准库中的 std::string 类是一个非常强大的工具,用于处理和操作字符串。它属于 <string> 头文件,并提供了一套丰富的功能和方法。以下是 std::string 类的一些主要特性和常用操作:

字符串是表示字符序列的类 1. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 2. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信 息,请参阅basic_string)。 3. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits 和allocator(配置器)作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个 类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。 总结: string是表示字符串的字符串类 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。 string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string; 不能操作多字节或者变长字符的序列。 在使用string类时,必须包含#iostream头文件以及using namespace std;

2. string 类的构造及基本接口函数
2.1 string 类的构造方法

string 类支持多种构造方式,以下是常见的构造函数:

下面简单演示上述多个函数如何使用和了解其功能,代码如下:

2.1.1 示例:
代码语言:javascript
复制
#include<iostream>
using namespace std;

int main()
{
	string s2("hello world");
	string s1;//构造一个空的字符串
	string s3("C++");//使用字符串C++构造s3对象
	string s4(10, 'c');//构造包含10个'c'的s4对象
	string s5(s2);//使用s2拷贝构造s5

	cout <<"s1:"<< s1 << endl;
	cout <<"s3:"<< s3 << endl;
	cout <<"s4:"<< s4 << endl;
	cout <<"s5:"<< s5 << endl;

	return 0;
}

输出结果:

s1: s3:C++ s4:cccccccccc s5:hello world

2.2 String类 常见的操作
代码语言:javascript
复制
#include<iostream>
using namespace std;
int main()
{
	string s2("hello world");
	
	cout << s2 << endl;
	cout << s2.size() << endl;
	cout << s2.length() << endl;
	cout << s2.capacity() << endl;

	s2.resize(5);
	cout << s2 << endl;
	
	//cout << s2.reserve() << endl;
	s2.clear();
	if (s2.empty())
		cout << "s2为空字符串" << endl;
	else {
		cout << "s2不为空字符串" << endl;
	}
	
	s2.resize(100);
	cout << s2 << endl;

	return 0;
}
2.2.1 示例:

hello world 11 11 15 hello s2为空字符串

补充:resize使用示例:

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "Hello";

    cout << "Size: " << s.size() << endl;     // 返回字符串长度
    cout << "Capacity: " << s.capacity() << endl;  // 返回容量
    s.resize(10, 'X');                        // 将长度改为10,多出部分用'X'填充
    cout << "Resized: " << s << endl;
    s.clear();                                // 清空字符串
    cout << "Is empty: " << s.empty() << endl;  // 检查是否为空

    return 0;
}

输出结果:

Size: 5 Capacity: 15 Resized: HelloXXXXX Is empty: 1

注意:

1. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不 同的是当字符个数增多时:resize(n)用'\0'来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。 2. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。 3. size和capacity都不包括’\0’。

2.3 字符串的遍历与访问

常见字符串遍历方法接口(interface):

2.3.1 示例:
代码语言:javascript
复制
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s2("hello world");

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

	cout<<s2.at(1) << endl;//返回指定位置的对象

    string::iterator it = s2.begin();
	//迭代器遍历
	while (it != s2.end())
	{
		cout << *it;
		++it;
	}
	cout << endl;

	//范围for,auto自动推导类型
	for (auto it = s2.begin(); it != s2.end(); it++)
		cout << *it;
	cout << endl;
	return 0;
}

输出结果:

xello world e xello world xello world

3. string类 高级接口(interface)
3.1 字符串的查找操作

常见查找接口如下:

C++中string::npos的概念,它是size_t的最大值,表示字符串结束

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

int main()
{
	string s1("hello world hello bit!");

	//find的使用
	//在字符串中查找子字符串或字符,返回其首次出现的位置,找不到则返回 string::npos
	size_t ret = s1.find('e');
	if (ret == string::npos)
		printf("未找到!\n");
	else
	{
		cout << "ret:"<<ret << endl;
	}

	size_t ret2 = s1.find('o');
	if (ret2 == string::npos)
		printf("未找到!\n");
	else
	{
		cout << "ret2:" << ret2 << endl;
	}

	//rfind的使用
	//反向查找字符串,返回最后一次出现子串或字符的位置
	size_t ret3 = s1.rfind('o');
	if (ret3 == string::npos)
		printf("未找到!\n");
	else
	{
		cout << "ret3:" << ret3 << endl;
	}

	//find_first_of()	
	//查找指定字符集中的任意一个字符,返回第一次出现的索引

	size_t ret4=s1.find_first_of("b");
	if (ret4 == string::npos)
		printf("未找到!\n");
	else
	{
		cout << "ret4:" << ret4 << endl;
	}
	size_t ret5 = s1.find_first_of("bit");
	if (ret5 == string::npos)
		printf("未找到!\n");
	else
	{
		cout << "ret5:" << ret5 << endl;
	}

	size_t ret6 = s1.find_last_of('t');
	if (ret6 == string::npos)
		printf("未找到!\n");
	else
	{
		cout << "ret6:" << ret6 << endl;
	}

	size_t ret7 = s1.find_last_of("bi");
	if (ret7 == string::npos)
		printf("未找到!\n");
	else
	{
		cout << "ret7:" << ret7 << endl;
	}

	return 0;
}

输出结果:

ret:1 ret2:4 ret3:16 ret4:18 ret5:18 ret6:20 ret7:19

3.1.1 相关链接
3.2 字符串的比较操作

这几个接口比较简单,日期类实现过,这里就不再重复了.

3.3 字符串的替换操作
3.3.1 相关链接
3.3.2 示例:
代码语言:javascript
复制
#include<iostream>
using namespace std;

int main()
{
	//我们将wzy换成C++
	string s1("hello wzy hello java!");

	cout << s1 << endl;
	s1.replace(6, 3, "C++");//将string s1开始的第六个字符的后面三个字符换成C++
	cout << s1 << endl;

	return 0;
}

输出结果:

hello wzy hello java! hello C++ hello java!

3.4 字符串的截取操作
3.4.1 示例:
代码语言:javascript
复制
#include<iostream>
using namespace std;

int main()
{
	string s1("hello wzy hello java!");

	string s2=s1.substr(10, 11);//
	cout << s2 << endl;
	return 0;
}

输出结果:

hello wzy hello java! hello java!

3.4.2 相关链接
3.5 字符串的插入与删除操作

补充: 由于C++是很注重效率的编程语言,上诉两个接口函数插入数据前均需要移动原有数据,效率低下,不建议使用。

3.5.1 示例:
代码语言:javascript
复制
#include<iostream>
using namespace std;

int main()
{
	string s1("hello wzy hello java!");
	cout << "orign staus:"<<s1 << endl;

	s1.insert(6, "n");
	cout << "After insert:"<<s1 << endl;

	s1.erase(6,1);
	cout << "After erase:" << s1 << endl;

	s1.erase(5);
	cout << "After erase:" << s1 << endl;
	return 0;
}

输出结果:

orign staus:hello wzy hello java! After insert:hello nwzy hello java! After erase:hello wzy hello java! After erase:hello

3.5.2 相关链接
3.6 字符串与整数的转换
代码语言:javascript
复制
#include<iostream>
#include<string>
using namespace std;

int main()
{
	int num = 20;
	string s1 = to_string(num);//将数值转换为字符串
	cout << s1 << endl;

	string s="123456";
	int sNum=stoi(s);//将字符串转换为整数
	cout << sNum << endl;

	string s3("123");
	float s4 = stof(s3);//将字符串转换为浮点数
	cout << s4 << endl;

	return 0;
}

输出结果:

20 123456 123

3.6.2 相关链接

最后

相信通过这篇文章你对C++STL->string的使用高级部分的有了初步的了解。如果此篇文章对你学习C++有帮助,期待你的三连,你的支持就是我创作的动力!!!

下一篇文章再会.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. string简介
  • 2. string 类的构造及基本接口函数
    • 2.1 string 类的构造方法
    • 2.1.1 示例:
    • 2.2 String类 常见的操作
    • 2.2.1 示例:
  • 2.3 字符串的遍历与访问
    • 2.3.1 示例:
  • 3. string类 高级接口(interface)
  • 3.1 字符串的查找操作
    • 3.1.1 相关链接
  • 3.2 字符串的比较操作
  • 3.3 字符串的替换操作
    • 3.3.1 相关链接
    • 3.3.2 示例:
  • 3.4 字符串的截取操作
    • 3.4.1 示例:
    • 3.4.2 相关链接
  • 3.5 字符串的插入与删除操作
    • 3.5.1 示例:
    • 3.5.2 相关链接
  • 3.6 字符串与整数的转换
    • 3.6.2 相关链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档