首页 > 编程语言 >C++ string类详解

C++ string类详解

时间:2024-09-06 23:50:00浏览次数:10  
标签:字符 string 1.3 int auto C++ 详解 字符串

文章目录

C++ | string类详解

1、标准库中的string类

1.1string类介绍

​ 略过,可以参考String类

1.2auto关键字和范围for读写string

例:

#include<iostream>
using namespace std;
int main()
{
	string str = "abcdefgh";
	for (auto ch : str) {//因为知道类型是char,所以也可以将auto改成char
		cout << ch << ' ';
	}//运行结果:`a b c d e f g h` 
    cout << endl;
   	for (auto ch : str) {
		cout << ++ch << ' ';
	}//运行结果:`b c d e f g h i`
	return 0;
}
1.2.1 auto关键字

这里补充2个C++11的小语法

  • 在早期C/C++中auto的含义是:使用**auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。**C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
  • 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
  • auto不能作为函数的参数,可以做返回值,但是建议谨慎使用
  • auto不能直接用来声明数组
	auto i = 5;					//推断为int类型
	auto str = "hello world";	//推断为const char*类型
auto mysum(int a1, int a2)->int
{
	return a1 + a2;
}//返回类型后置,auto为返回值占位符,真正的返回类型是int
  • 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量,简单来说就是从左往右的推导
auto x= 1, y = 4.2;

报错,因为先推导x的类型为int,再推导y的类型为double,但是x和y的类型不一样,所以会报错

  • auto会使用表达能力更强的类型
auto x = true ? 1 : 4.2;

在标准中,auto会采用表达能力更强的类型,所以x的类型会推导为double类型

1.2.2范围for
组成内容:

for循环后的括号由冒号:分为两个部分:

  • 范围声明式:范围内用于迭代的变量,其类型式范围表达式中元素的类型或元素的类型的引用

  • 范围表达式:表示被迭代的范围,可以是数组或者式对象,对于对象必须满足以下之一的条件:

    • 对象类型定义了begin和end成员函数
    • 定义了以对象类型为参数的begin和end普通函数。
特点:
  • 自动迭代,自动取数据,自动判断结束。
  • 范围for可以作用到数组和容器的对象上进行遍历
  • 范围for的底层很简单,容器的遍历实际上就是替换为迭代器,这个从汇编层也可以看到
举例:
#include<iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
	int array[] = { 1, 2, 3, 4, 5 };
	// C++98的遍历
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
	{
		array[i] *= 2;
	}
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
	{
		cout << array[i] << endl;
	}
	// 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;
}

1.3string类的常用接口说明

1.3.1 常见构造方式
函数名称功能说明
string()构造空的string类对象,即空字符串
string(const char*s)用string来构造string类对象
string(size_t,char c)包含n个字符c
string(const string&s)拷贝构造函数

举例:

int main()
{
	string s1;      		  // 构造空的string类对象s1
	string s2("hello world"); // s2:helloc world	用C格式字符串构造string类对象s2
    string s3(5,c);			  // s3:ccccc			用五个c来初始化s3
	string s4(s2); 			  // s4:hello world		拷贝构造s3
    return 0;
}
1.3.2 常见容量相关操作
函数名称功能
size返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty检测字符串释放为空串,是然会true,否则返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符的个数改成n个,多出的空间用字符c来填充

举例:

int main()
{
	string s1 = "hello world";
    string s2("hello string");
    cout << s1.size();
    cout << s1.length();
    cout << s1.capacity();
    cout << 
    return 0;
}

注意:

  • size()length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()8880
  • clear()只是将string中的有效字符清空,不改变底层空间大小
  • resize(size_t n)resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间resize(size_t n, char c)用字符c来填充多出来的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变
  • reserve(size_t res_arg = 0)为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容器的大小

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

函数名称功能说明
operator[]返回pos位置的字符,const string 类对象调用
begin + endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式
1.3.4 string类对象的修改操作
函数名称功能
push_back在字符串后面尾插字符
append在字符串后追加一个字符串
operator+=在字符串后追加字符串
c_str返回c格式字符串
find + npos从字符串指定位置开始往后找字符,返回该字符在字符串中的位置
rfind从字符串指定位置开始往前找字符,返回该字符在字符串中的位置
substr在str中从指定位置开始,截取n个字符,然后将其返回

注意:

  • 在string尾部追加字符时,s.push_back(c) ; s.append(1,c) ; s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,常常用于连接字符或者字符串
  • 对string类对象操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
1.3.5 string类非成员函数
函数功能说明
operator+由于传值返回,导致深拷贝效率低
operator>>输入运算符重载
operator<<输出运算符重载
getline获取一行字符串
relational operators大小比较

输入运算符重载 |
| operator<< | 输出运算符重载 |
| getline | 获取一行字符串 |
| relational operators | 大小比较 |

标签:字符,string,1.3,int,auto,C++,详解,字符串
From: https://blog.csdn.net/TTKunn/article/details/141977657

相关文章

  • C++vector类相关OJ练习
    个人主页:C++忠实粉丝欢迎点赞......
  • windows C++ 并行编程-转换使用取消的 OpenMP 循环以使用并发运行时
    某些并行循环不需要执行所有迭代。例如,搜索值的算法可以在找到值后终止。OpenMP不提供中断并行循环的机制。但是,可以使用布尔值或标志来启用循环迭代,以指示已找到解决方案。并发运行时提供允许一个任务取消其他尚未启动的任务的功能。此示例演示如何将一个不需要运行所有......
  • windows C++ 并行编程-使用 加速器 对象(下)
    并发运行时支持各种编程模型。这些模型可能会与其他库的模型重叠或对其进行补充。本部分中的文档将OpenMP与并发运行时进行比较,并提供有关如何迁移现有OpenMP代码以使用并发运行时的示例。OpenMP编程模型由开放标准定义,具有与Fortran和C/C++编程语言定义完善的绑定......
  • C++中的 new 与 delete
    我们今天来学习C++中的new与delete。它们2个是C++中的关键字,作用是在freestore(C语言中的堆区)中申请空间来存放数据。存在的意义为什么我们要在freestore中去存放数据呢?——因为freestore中的生命周期是由我们程序员所控制的。在某些时刻,我们只需要暂时性地使用一些数据。在这......
  • PDF标准详解(四)——图形操作符
    上一节,我们了解了PDF中cm操作符,它是定义变换矩阵的。同时也了解到re是创建一个矩阵的。上一节也说过,它用来构建一个路径,具体什么是路径,路径有什么作用呢?这些将在本节给出解释图形操作符是用来在pdf中构建内容并输出到相关设备上进行显示的。pdf中我们能看到的内容几乎都是由图形......
  • c++一个数因子和(快速求解)
    void一个数因子和(int整数){//缘由https://ask.csdn.net/questions/1054457#answer_1251715 inthe=0,j=0;stringa=""; while(++j<整数)if(!(整数%j))he+=j,a+=to_string(j)+"+"; cout<<a<<"的因子和:"<<he......
  • MySQL 字符串操作详解和案例示范
    MySQL字符串操作详解MySQL提供了丰富的字符串操作函数,能够对这些字符串进行截取、定位、替换等操作。本文将详细讲解MySQL中的字符串操作函数,包括SUBSTRING()、SUBSTR()、LEFT()、RIGHT()、LOCATE()、POSITION()、FIND_IN_SET()、ELT()、INSERT()和REPLACE(),并分析......
  • C++初学(19)
    19.1、文本IO如果你需要写入一千份以上的数据,如果手打那可太浪费时间了。这种情况下,应该让程序直接读取文件;同样的,让程序将输入写入到文件也是更加方便。文本I/O的概念:使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。无论目标数据类型是什么,输......
  • C++入门基础(类和对象)
    7.类和对象1.面向对象和面向过程的区别面向对象:是将事务抽象成类和对象,以对象为中心,通过对象的交互实现程序的功能,可维护性强面向过程:是将复杂问题一步步拆分,通过依次执行来解决问题,可维护性比较弱2.类大小的计算1.内存对齐考虑内存对齐的默认大小vs默认是8字......
  • C++入门基础
    6.C++入门基础1.函数重载1.什么是函数重载函数重载是实现C++多态的一个重要技术,是在同一作用域内相同函数名因为参数的类型不同或者个数不同或者都不同构成重载2.C++是如何支持函数重载的1.命名改变根据对应的参数类名改成比如voidfoo(int)voidfoo(double)_fo......