C++ String(2)

reserve

这个地方要和reverse区分清楚,reserve是保留的意思,而reverse是逆置的意思

reserve函数可以预先分配内存

reserve(n)代表至少保留可以容纳n个字符的空间(具体多大和编译器有关)

比如reserve(100),代表开100个字节大小的空间,但是实际可能是100,也可能比100大,这和编译器的对齐有关

那如果我原本的空间比我要保留的空间大,它会缩吗?

可能会缩到n大小,但是有的编译器会优化缩小到比n大的值!

如果还有数据,它就不会缩,没有数据可能就会缩

resize

resize会改变capacity和size

resize(n,x);

没给值默认填的是\0

在原有字符的基础上扩容,扩容到n个字节空间大小,并给没有初始化的空间全部初始化成x

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";

    // 扩展字符串至长度10,使用'X'填充
    str.resize(10, 'X');
    std::cout << str << std::endl; // 输出: HelloXXXXXX

    // 截断字符串至长度3
    str.resize(3);
    std::cout << str << std::endl; // 输出: Hel

    return 0;
}

 但是如果要开的空间比原有空间小的时候,会删要开的空间的后面多出的内容

会让size达到n,但是capacity不会改变

为啥我们缩容这么麻烦?答案是我们的内存是一块一块申请的,释放也是一块一块释放的,

我们不能释放一部分,所以缩容的本质是开一块新的空间,将原有空间缩容后的数据拷贝过来,再将原来那片空间释放掉

assign

assign函数的功能就是将原有的字符串覆盖掉它可以支持一些赋值操作符无法做到的事,因为赋值操作符是双目操作符,只能有两参数,但是assign可以有多个参数

 insert

insert在指定位置插入

比如说我们要实现头插,因为头插效率太低了,string没有直接的头插函数,但是我们可以用insert

 erase

删除数据

int main() {
    string s1 = "hellosahdasdhkasjxzkjh";
    s1.erase(5, 2);//删掉第5个字符后面的2个字符
    s1.erase(16);//将第16个字符后面的字符全部删掉
    s1.erase(5,99);//第五个字符后面没有99个字符,就把第5个字符后面的全部删掉
    cout << s1 << endl;
    return 0;
}

replace

替换字符或者字符串

int main() {
    //要求把world替换成would
    string s1 = "hello world";
    s1.replace(6,5,"would");//在第6个位置替换would的5个字符
    cout << s1 << endl;
    return 0;
}

c_str

更好的和C的接口配合

int main() {
    string s1 = "hello";
    cout << s1 << endl;//底层是操作符<<重载
    cout << s1.c_str() << endl;//大部分情况下和上面的结果相同,但是底层是调用c_str所依赖的库
    string filename = "test.cpp";
    FILE* fout = fopen(filename.c_str(), "r");//这个地方fopen是C的库的函数,用c_str接口可以适配
    return 0;
}

find

数的基本形式用于在字符串中查找指定的子串或字符(完整的),并返回该子串或字符的起始位置。如果未找到,则返回 std::string::npos ,这是一个特殊值,通常表示最大 size_t  值。

rfind

rfind函数和find函数的区别在于find函数是找第一个匹配的位置,rfind是找最后一个匹配的位置

substr

函数原型 std::string substr(size_t pos = 0, size_t len = std::string::npos) const;参数说明

 pos : 子字符串开始的位置,基于0的索引。如果不提供,默认为0,即从字符串的开头开始。
 len : 要提取的子字符串的长度。如果不提供, std::string::npos 将被用作默认值,意味着子字符串将从 pos 开始一直延伸到原字符串的末尾。

返回值
返回一个新的字符串,表示原始字符串从 pos 位置开始,长度为 len 的子字符串。如果 len 为 std::string::npos ,则返回从 pos 开始至字符串末尾的子字符串。

 find_first_of

 size_t find_first_of (const string& str, size_t pos = 0) const;
size_t find_first_of (const char* s, size_t pos = 0) const;
size_t find_first_of (const char* s, size_t pos, size_type n) const;
size_t find_first_of (char c, size_t pos = 0) const;

参数说明

  • str:要搜索的字符串。

  • s:C风格的字符串。

  • n:要搜索的字符数(从s开始)。

  • c:要搜索的单个字符。

  • pos:开始搜索的位置(默认为0)。

返回值

  • 如果找到,返回第一个匹配字符的位置。

  • 如果没找到,返回string::npos。

用途详解

 find_first_of的用途就是在一个字符串中查找另一个字符串(或字符)中任意一个字符第一次出现的位置。(标红标粗的代表和find函数的区别)

find_last_of

和find_first_of的区别在于这个函数是查找最后一次出现的位置

find_first_not_of

这个函数和find_first的区别是这个函数是查找任意一个字符第一次不出现的位置!

find_last_not_of

这个函数和find_first的区别是这个函数是查找任意一个字符最后一次不出现的位置!

getline

我们会发现我们用流插入流提取或者scanf和printf的时候经常因为空格和换行键会把无法读取一个完整的数据

比如 hello world编译器会认为这是输入的两个数据,hello会被输入但是world会被放到缓冲区下一次再输入

那有没有好的方式解决这个问题呢?

String提供了getline()函数

getline函数通常用于从标准输入(如键盘)或文件输入流中读取一行文本。它有两个主要的重载版本:

  1. 从输入流读取一行,直到换行符:

【cpp】
 std::istream& getline (std::istream& is, std::string& str, char delim);

  • is:输入流对象,如std::cin或文件输入流。

  • str:用于存储读取内容的string对象。

  • delim:用作行终止符的字符,默认为\n。

int main() {
    std::string line;
    std::cout << "请输入一行文本(按回车结束):";
    std::getline(std::cin, line);//cin是istream的全局对象
    std::cout << "你输入的文本是:" << line << std::endl;
    return 0;
}

向上面这样只有遇到换行才结束,而不是换行或者空格都结束

itoa

将整形数转换成字符串(浮点数不可用)

这个函数不太好用,主要是需要我们自己去开空间

itoa函数用于将整型数转换为字符串。它定义在头文件 <stdlib.h> 中,接受一个整型数和一个基数(如10表示十进制,16表示十六进制等),并将该数转换为字符串形式。

C++ 中没有原生的  itoa  函数, itoa  实际上是 C 标准库的一个扩展,用于将整型数转换为字符串。在 C++ 中,通常推荐使用标准库中的  std::to_string  函数来实现类似的功能,这样可以保证代码的可移植性和安全性。

以下是使用  std::to_string  函数将整型数转换为  std::string  的示例:

int main() {
    int num = 12345;
    std::string str = std::to_string(num);
    std::cout << "转换后的字符串为: " << str << std::endl;
    return 0;
}
 

输出结果为:
转换后的字符串为: 12345
在这个示例中,整数  12345  被转换为字符串  "12345"  并存储在  std::string  对象  str  中。

需要注意的是, std::to_string  是 C++11 标准引入的函数,如果你使用的是较老的编译器,可能需要检查是否支持该函数。此外, std::to_string  仅支持十进制转换,如果你需要进行其他进制的转换,可能需要自己实现转换逻辑或使用第三方库。

atoi

将字符串转换成整型数(浮点数不可用)

atoi函数用于将字符串转换为整型数。它扫描参数字符串,跳过前面的空格,直到遇上数字或正负号才开始转换。当遇到非数字或字符串结束符'\0'时,转换结束,并返回转换后的整型数。

int main() {
    char a[] = "123";
    char b[] = "-100";
    int c;
    c = atoi(a) + atoi(b);
    printf("c = %d\n", c);
    return 0;
}

输出结果为:
 c = 23
在这个例子中,字符串"123"和"-100"被转换为整型数123和-100,然后相加得到23。

需要注意的是,atoi函数只能处理整数字符串,如果字符串中包含非数字字符(除了正负号和可能的开始空格),则会在遇到这些字符时停止转换。此外,如果字符串以数字开头但后面跟随的是非数字字符(如浮点数的一部分),则只会转换开头的数字部分。

functions

我们接下来来看下面这些函数

拿stod举例就是将字符串转换成double类型,这些函数都是支持类型转换的函数,但是只有C++11支持

string本身就是一个模板

这些都是string的不同模板刻出来的,这些模板涉及到编码,我们学过的编码目前只有ascll码,

但是ascll码多是对于英文的,如果我们要中文和日文的怎么办呢?

这些其他的模板给我们提供了帮助 

to_string

 

to_string函数的功能就是 把其他类型转换成string类型

异常情况:std::to_string 一般不会抛出异常,除非在内存分配失败的极端情况下。

精度问题:对于浮点数,std::to_string 会将其转换为具有固定精度的字符串,默认情况下可能会保留一定数量的小数位。如果需要更高的精度控制,可以使用 std::ostringstream 或 std::format(C++20 及以后)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值