【C++】String常用的函数总结

news/2024/7/24 2:22:17 标签: 开发语言, c++, string函数

目录

一、string的构造函数方式:

二、常用的大小/容量相关操作: 

三、string的常用修改操作:

四、string的遍历:

五、string的任意位置插入 / 删除:

六:补充:


一、string的构造函数方式:

代码形式:

void Test1()
{
	string s1();				// 空字符串
	string s2("Hello World");	// 字符串初始化为 "Hello World" 
	string s3(s2);				//拷贝构造: 将s2复制给s3、  输出为: Hello World
	string s4(s2, 2, 3);		// 从 s2 的下标 2 的位置开始复制 3 个值给 s4,输出为: llo
	string s5(s2, 3);			// 从 s2 的下标 3 的位置开始 复制到结尾个字符给 s5,输出为: llo World
	string s6(5, '#');			// 生成5个字符为 # 的字符串,输出为: #####

}

二、常用的大小/容量相关操作: 

 

代码形式:

void Test2()
{
	string s1("Hello World");
	cout << s1.size() << endl;		// 输出为 11
	cout << s1.length() << endl;	// 输出为 11
	cout << s1.max_size() << endl;	// 支持的最大长度
	cout << s1.capacity() << endl;	// 输出为 15
	
	// clear清除有效数据,但不清除空间(capacity)
	s1.clear();
	cout << s1 << endl; // 输出为空,因为clear清除了有效字符

	// reserve 可以直接开空间,省去字符串追加字符时的自动扩容操作,提高一点效率
	s1.reserve(100);	// 扩容时有效编译器并不一定会只扩到给定值,有可能会多扩容一些空间
	cout << s1.capacity() << endl; // 当 reserev 中的参数小于capacity时并不会进行缩容
	
	// 缩容: shrink_to_fit 
    // 缩容到16(显示的是15,但是一般会包含算上\0入内,capacity不算上\0,所以实际是16)
	s1.shrink_to_fit();
	cout << s1.capacity() << endl;// 输出16

	// resize 
	string s2("Hello");
	s2.resize(7, '#'); // 将 s2 的有效字符个数改成7个,不足7个的用 # 替换
	// resize 当不指定第二个参数时默认为'\0'
	// 当resize 给的值大于 capacity 时 resize 会进行相应的扩容 
	// 当resize 给的值小于 capacity 时 resize 不会进行缩容 

	cout << s2 << endl; // 输出为: Hello##
}

三、string的常用修改操作:

 

代码形式: 

void Test3()
{
    string s1;
    string s2("Hello");
    s1.push_back('c');
    s1.append("ccccc");
    s1 += "abcde"; // 一般用 += 比较多,因为可以直接追加字符/字符串
    s1 += s2;

    // find(c, n): 从下标 n 位置查找字符 c ,找到返回下标,找不到返回npos
    // replace(n, m, "c"): 从下标 n 开始的 m 个字符 替换为c:

    // 以上两个结合使用讲解: 将s3中的空格替换为 ##
    string s3("Youth gives you light please don't let it down");
    size_t pos1 = s3.find(' '); // find 不给右参数时默认从 0 开始
    while (pos1 != string::npos)
    {
        s3.replace(pos1, 1, "##");
        pos1 = s3.find(' ');
    }
    cout << s3 << endl;

    // rfind 用法和 find 相似,不同的是 rfind 是从后往前找
    // rfind(c, n) 从第 n 个位置往前找 c ,找到返回下标,找不到返回npos
    // rfind不给右参数时默认从字符串最末尾开始

    // substr(n, m) 主要功能为复制子字符串,从下标 n 开始,复制 m 个字符
    string s4("Hello World!");
    string s5 = s4.substr(3, 5); // 输出为: lo Wo

    // 当substr不给参数时就为直接拷贝构造
    string s6 = s4.substr(); // 输出为: Hello World!

    // 当只给定左参数时,就从 n 开始复制到结尾
    string s7 = s4.substr(3); // 输出为: lo World!

}

四、string的遍历:

进行字符串的遍历时可以用下标法或者借助迭代器进行遍历。

代码形式:

void Test4()
{
    string s1("Hello World");
    // 下标法: C++中重载了 [] 符号,加上对应的下标即可访问
    for (int i = 0; i < s1.size(); i++)
    {
        cout << s1[i] << " ";
    }
    cout << endl;

    // 借助迭代器:
    // str.begin()   指向字符串的第一个字符位置
    // str.end()     指向字符串的最后一个字符的下一个位置
    string::iterator it1 = s1.begin();
    while (it1 != s1.end())
    {
        cout << *it1 << " ";
        it1++;
    }
    cout << endl;

    // 反向迭代器:
    // str.rbegin()   指向字符串的最后一个字符的位置
    // str.rend()     指向字符串的第一个字符的前一个位置
    string::reverse_iterator rit1 = s1.rbegin();
    while (rit1 != s1.rend())
    {
        cout << *rit1 << " ";
        rit1++;
    }
    cout << endl;
}

 

五、string的任意位置插入 / 删除:

但是在实践中一般很少用到 insert 与 erase 因为要挪动数据,效率很低。

代码形式: 

void Test5()
{
    string s1("Hello World!");
    s1.insert(2, "##");
    cout << s1 << endl; // 输出: He##llo World!

    string s2("Hello World!");
    s2.erase(4, 6);
    cout << s2 << endl; // 输出: Helld!

}

六:补充:

void Test6()
{
    // compare: 字符串大小比较
    // 原理: 两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇 '\0’为止。
    string s1("abcd");
    string s2("aBcd");

    // s1 与 s2 相比第二个字符 b 的ASCII值大于 B
    cout << s1.compare(s2) << endl; // s1 > s2 所以输出1


    // operator >>   输入运算符重载,可以直接对字符串进行输入
    // operator <<   输出运算符重载,可以直接对字符串进行输出
    string s3;
    cin >> s3;
    cout << "s3: " << s3 << endl;

    // getline(cin, str) 获取一行字符串
    // cin 输入时默认空格是作为结束分隔,所以可以用getline将空格输入字符串中
    string s4;
    getline(cin, s4);
    cout << "s4: " << s4 << endl;

}

注意事项:

1、cin 与 getline 一起用时注意:

        cin只是在缓存区中,把字符读走,会剩余\n在缓存区中,但是getline对\n极度敏感,如果上一个 cin 完立马接 getline 的话会导致getline刚开始读入便遇到/n于是停止读入数据。

解决方法:可以手动清除换行符,cin 后加上   cin.ignore();


http://www.niftyadmin.cn/n/5411158.html

相关文章

Python 系统学习总结(基础语法+函数+数据容器+文件+异常+包+面向对象)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 六天时间系统学习Python基础总结&#xff0c;目前不包括可视化部分&#xff0c;其他部分基本齐全&#xff0c;总结记录&#xff0…

图解目标检测的现代历史

任务分类 图像分类 根据图像的主要对象对图像进行分类。 目标定位 预测包含主要对象的图像区域。然后&#xff0c;可以使用图像分类来识别该区域内的物体 目标检测 定位和分类出现在图像中的所有对象。这个任务通常包括&#xff1a;确定区域&#xff0c;然后对其中的对象进行…

three.js如何实现简易3D机房?(三)显示信息弹框/标签

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;(二&#xff09;模型加载的过渡动画&#xff1a;http://t.csdnimg.cn/onbWY 目录 七、创建信息展示弹框 1.整体思路 &#xff08;1&#xff09;需求&#xff1a; &#xff08;2&#xff09;思路&#xff1a;…

django学习记录07——订单案例(复选框+ajax请求)

1.订单的数据表 1.1 数据表结构 1.2 数据表的创建 models.py class Order(models.Model):"""订单号"""oid models.CharField(max_length64, verbose_name"订单号")title models.CharField(max_length64, verbose_name"名称&…

C#实现选择排序算法

以下是使用C#实现选择排序算法的示例代码&#xff1a; using System;class SelectionSort {static void Main(string[] args){int[] arr { 64, 25, 12, 22, 11 };Console.WriteLine("排序前&#xff1a;");PrintArray(arr);SelectionSortAlgorithm(arr);Console.Wr…

[java] 23种设计模式之责任链模式

1.1例子 公司请假系统&#xff0c;业务逻辑如下&#xff1a; 不超过3天的&#xff0c;组长审批 超过3天且小于7天的&#xff0c;总监审批 超过7天且小于15天的&#xff0c;部长审批 超过15天&#xff0c;前端直接拒绝&#xff0c;不会进入审批流程&#xff08;违反了公司的请假…

鸿蒙os开发做全局路由拦截

在HarmonyOS开发中&#xff0c;全局路由拦截通常用于实现一些通用的导航守卫功能&#xff0c;比如权限验证、页面间跳转前的数据预处理等。虽然文档没有明确提供类似于Vue.js中的全局前置守卫&#xff08;global beforeEach&#xff09;那样的机制&#xff0c;但可以通过以下方…

智慧城市的未来:利用数字孪生技术推动智慧城市的智能化升级

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、城市规划与建设 2、城市管理与运营 3、公共服务与民生改善 4、应急管理与灾害防控 四、数字孪生技术推动智慧城市的智能化升级的价值 1、提高城市管理的智能化水平 2、优化城市资源配置 …