【C++】String类基本接口介绍(多看英文文档)

这篇具有很好参考价值的文章主要介绍了【C++】String类基本接口介绍(多看英文文档)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

string目录

目录

 如果你很赶时间,那么就直接看我本标题下的内容即可!!

一、STL简介

1.1什么是STL

1.2STL版本

1.3STL六大组件

1.4STL重要性

1.5如何学习STL

二、什么是string??(本质上是一个类)

三、string的类模板(什么?string居然利用了模板??)

三、string的三种构造(拷贝构造也是构造奥)

四、stirng的三种遍历方式

4.1 [ ] + 下标(operator[ ]的重载函数)

4.2基于范围for循环(C++11语法糖) 

4.3迭代器遍历

五、string的迭代器(迭代器是一个类,封装了指针,模拟了指针的操作)

5.1begin接口和end接口

5.2const迭代器

5.3迭代器和指针的区别

六、string之capacity(resize,reserve,clear)

6.1resize(Resizes the string to a length of n characters) 

6.2reserve预留空间(一般用于扩容)(不会改变size)

6.3clear(清空字符串)

七、string之Element Access(元素访问)

八、string之modify(+=,append,insert,erase,swap)

8.1operator+=(最牛逼的尾插)

8.2append(尾部追加数据,但是没有+=牛逼)

8.3insert(任意位置插入)(一般不用,浪费时间)

8.4erase(任意位置删除)

8.5 swap(是一个参数,和平常见到的普通的不一样)

九、string之operation操作函数(c_str,find,,substr)

9.1c_str(为了使得C++与C语言之间有接口,算是大使馆)

9.2find(查找字符串,里面也有npos)

9.3rfind(对于找文件后缀这种问题来说用rfind非常舒服)

9.4find_first_of(找出字符子集第一个出现的位置)

 9.5substr(截断字符串并返回)

十、非成员函数的重载函数(getline)


【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

 如果你很赶时间,那么就直接看我本标题下的内容即可!!

当然,请看下面的列表,其中包含了C++中`std::string`类的常用成员函数和操作符,以及每个函数和操作符的简要描述和一个示例用法:

1. `begin`: 得到指向字符串开头的Iterator

std::string::iterator it = str.begin();

2. `end`: 得到指向字符串结尾的Iterator

std::string::iterator it_end = str.end();

3. `size` (或 `length`): 得到字符串的大小(capacity是返回字符串开辟空间的大小)

std::string str = "Hello";
std::cout << "Size: " << str.size() << std::endl;

4. `empty`: 判断是否为空

if (str.empty()) {
    std::cout << "String is empty." << std::endl;
}

5. `operator[]`: 取第n个元素,相当于数组

char firstChar = str[0];

6. `c_str`: 取得C风格的const char* 字符串

const char* cString = str.c_str();

7. `data`: 取得字符串内容地址

const char* data = str.data();

8. `operator+=`: 字符串尾插操作符

str1 += str2;

9. `find`: 查找子串在字符串中的位置

size_t found = str.find("World");

10. `substr`: 得到子串

std::string sub = str.substr(6, 5);

11. `compare`: 比较字符串

int result = str1.compare(str2);
if (result == 0) {
    std::cout << "Strings are equal." << std::endl;
}

12. `operator+`: 字符串链接

std::string result = str1 + str2;

13. `operator==`: 判断是否相等

if (str1 == str2) {
    std::cout << "Strings are equal." << std::endl;
}

14. `operator!=`: 判断是否不等于

if (str1 != str2) {
    std::cout << "Strings are not equal." << std::endl;
}

15. `operator<`: 判断是否小于

if (str1 < str2) {
    std::cout << "str1 is less than str2." << std::endl;
}

16. `insert`: 插入字符

str.insert(3, " inserted");

17. `resize`: 重新分配空间
   - 描述:`resize` 函数用于更改字符串的大小,可以增加或减小字符串的长度。如果新的大小大于当前大小,新元素将被默认初始化。(三种情况)

 std::string str = "Hello";
     str.resize(8); // 增加字符串大小
     std::cout << str << std::endl; // 输出 "Hello\0\0\0"
     
     str.resize(3); // 缩小字符串大小
     std::cout << str << std::endl; // 输出 "Hel"

18. `reserve`: 预留空间
   - 描述:`reserve` 函数用于预留字符串的存储空间,以避免在后续操作中重新分配内存。这对于减少动态内存分配的开销很有用。

 std::string str;
     str.reserve(100); // 预留至少能容纳100个字符的空间
     str = "Hello, World!"; // 不会触发重新分配内存

请注意,以上示例仅供参考


一、STL简介

1.1什么是STL

STL (standard template libaray - 标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架

1.2STL版本

原始版本:
Alexander Stepanov Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意
运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使
用。 HP 版本 -- 所有 STL 实现版本的始祖。
P. J. 版本:
P. J. Plauger 开发,继承自 HP 版本,被 Windows Visual C++ 采用,不能公开或修改,缺陷:可读性比较低,
符号命名比较怪异。
RW 版本:
Rouge Wage 公司开发,继承自 HP 版本,被 C+ + Builder 采用,不能公开或修改,可读性一般。
SGI 版本:
Silicon Graphics Computer Systems Inc 公司开发,继承自 HP 版 本。被 GCC(Linux) 采用,可移植性好,
可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。 我们后面学习 STL 要阅读部分源代码,
主要参考的就是这个版本。

1.3STL六大组件

STL 共有容器、配接器、迭代器、空间配装器、算法、仿函数六大组件,其内部包含的具体内容如下:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

1.4STL重要性

网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,直接使用即可,大大提高了解题和开发的效率;因此,STL 在笔试、面试以及工作中其都是一个被重点考察的对象

1.5如何学习STL

告诉大家一个英文文档的查询接口网站:cplusplus.com - The C++ Resources Network

(注:cplusplus 更新之后需要注册才能使用,我们可以点击右上角的 “Legacy version” 回到旧版,个人认为旧版的使用体验比新版要好),因为 cplusplus 更适合初学者,我们学习STL过程中遇到的任何函数接口、函数参数等等方面的内容都可以在 cplusplus 上通过搜索解决

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

阅读优秀的C++书籍:C++是一门比较难的语言,其中的细节非常多,我现在偶尔也会看STL源码剖析

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

想要电子版的可以来私聊我!!


二、什么是string??(本质上是一个类)

C语言中,字符串是以’\0’结尾的若干个字符的集合,为了操作方便,C语言 string.h 头文件提供了一些系列的库函数,但是这些库函数与字符串是分离开的,不符合面向对象的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

基于上面这些原因,C++标准库提供了 string 类,string 类中提供了各种函数接口,比如类的六个默认成员函数、字符串插入删除、运算符重载等等,我们可以使用 string 来实例化对象,然后通过 string 的各种接口来完成对该对象的各种操作

string 类的实现框架大概如下:

namespace std {
	template<class T>
	class string {
	public:
		// string 的各种成员函数
		
	private:
		T* _str;
		size_t _size;
		size_t _capacity;
		//string 的其他成员变量,比如npos
	};
}

注:严格来说 string 其实并不属于 STL,因为 string 出现的时间比 STL 要早(这也是为什么出现了.length(),和.size()俩个计算长度的原因),但是由于 string 的各种接口和 STL 中其他容器的接口非常类似,所以我们可以把 string 也当作 STL 的一种,放在一起学习


三、string的类模板(什么?string居然利用了模板??)

我们打开文档网址搜索string后会发现,string 其实是 basic_string 类模板使用字符类型 char 实例化得到的一个类(下面的英文一一定得耐着性子看完)

其实正是一个动态增长字符数组

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

那么什么是basic_string呢??

basic_string 是一个可以使用任意字符类型来实例化的类模板:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

实在看不懂,我还是利用了翻译软件,发现居然是泛化!!!你问我什么是泛化?快去看我的模板博客!!模板初阶

所以,我们平时使用的 string 本质上是 basic_string<char>,我们不用自己显式实例化是因为 string 内部进行了 typedef:

typedef       basic_string<char, char_traits, allocator>     string 


三、string的三种构造(拷贝构造也是构造奥)

string 提供了很多构造函数,我们只需要掌握其中最常用的几个就可以,其余的如果有需要再查询文档:(最常用的就是三个

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

(constructor)函数名称 功能说明
string()(重点) 构造空的string类对象,即空字符串
string(constchar*s)(重点) 用C-string来构造string类对象
string(size_tn,charc) string类对象中包含n个字符c
string(conststring&s)(重点) 拷贝构造函数

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


四、stirng的三种遍历方式

4.1 [ ] + 下标(operator[ ]的重载函数)

我们现在先不介绍 [  ] 怎么使用,我们先对 [ ] 的重载实现和优点做一个深入了解

在数组中,我们也可以用[  ]进行数据访问,但是他对于越界读和越界写的边界感很模糊,以下是我们自己写的数组重载方括号函数:

T& operator[](int index) {
        // 使用assert检查越界
        assert(index >= 0 && index < size);
        return data[index];
    }

这样更加保证了C++语言的封装性,更好更优秀;在string库中,也对方括号进行了重载

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

string中方括号的重载与上方类似,就是把assert的范围改成以下即可

index >= 0 && index < data.size()

 总的来说,我们利用 [ ] 遍历访问的方式如下:

void test_string2()
{
	string s1("1234");
	//需求:让对象s1里面的每个字符都加1

	//如果要让字符串的每个字符都加1,肯定离不开遍历,下面学习三种遍历string的方式。
	//1.下标 + []
	for (size_t i = 0; i < s1.size(); i++)
	{
		s1[i]++;//本质上
	}
	cout << s1 << endl;//GB2312兼容ascll编码,所以++后的结果为2345.
}

4.2基于范围for循环(C++11语法糖) 

void test_string2()
{
	//2.范围for
	for (auto& ch : s1)//自动推导s1数组的每个元素后,用元素的引用作为迭代变量,通过引用达到修改s1数组元素的目的。
	{
		ch++;
	}
	cout << s1 << endl;
	//在上面这种需求下,范围for看起来似乎更为方便	
}

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

以上俩张图片摘自小羊C++入门范围for的讲解中 

4.3迭代器遍历

[  ]只是一朝鲜,要想通用还得看我迭代器!

迭代器在使用的方式和行为上比较像指针,但是它和指针还是有区别的,它既有可能是指针,又有可能不是指针。在定义时要指定类域,譬如下面代码it1的定义,就需要指定类域里面的iterator类型。从下面代码可以看出,it1不仅可以访问而且还可以修改对象s1的内容。并且除string外,我们头疼的list也可以照常使用iterator,这也验证了iterator的普适性

list<int> lt;
	list<int>::iterator ltit = lt.begin();
	while (ltit != lt.end())
	{
		cout << *ltit << " ";
		ltit++;
	}
	cout << endl;

所以我们在遍历字符串的时候,利用begin与end接口:

int main()
{
	string s1("i love gao_peng_yan");
	string::iterator it1=s1.begin();
	while(it1!=s1.end())
	{
		cout << *it1 ;
		it1++;//别忘了迭代器++,要不然走不后去
	}

	return 0;
}

迭代器这么重要的知识,放在遍历的小标题里可太委屈了,所以客官请往下看!! 


五、string的迭代器(迭代器是一个类,封装了指针,模拟了指针的操作)

Iterators 是C++中的迭代器,具有普适性,对于大多数容器都可以适用,大家可以把它当成指针来理解,当然,并不是所有迭代器的底层都是用指针实现的:

typedef char* iterator;  //简单理解string中的迭代器

实际代码写法:

string::iterator it1=s1.begin();//(it1的类型是属于string类域当中的)

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

函数名称 功能说明
begin() 返回一个指向字符串中第一个字符的迭代器
end() 返回一个指向字符串最后一个字符下一个位置(‘\0’)的迭代器
rbegin() 反向开始,返回一个指向字符串最后一个字符下一个位置(‘\0’)的迭代器
rend() 反向开始,返回一个指向字符串中第一个字符的迭代器

这里有一个end迭代器在哪里的误区,我画个图出来给大家看: 

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

5.1begin接口和end接口

在我们遍历的时候,我们需要用到接口begin与end 通过查阅文档,我么们发现他们的返回值都是迭代器。begin()会返回获取第一个字符的迭代器,end()会返回最后一个字符下一个位置的迭代器,一般情况下就是标识字符\0。其实在使用上就是类似于指针,解引用迭代器就可以获得相应的字符,然后就可以对字符进行操作。

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

所以我们在遍历字符串的时候,利用begin与end接口:

int main()
{
	string s1("i love gao_peng_yan");
	string::iterator it1=s1.begin();
	while(it1!=s1.end())
	{
		cout << *it1 ;
		it1++;//别忘了迭代器++,要不然走不后去
	}

	return 0;
}

5.2const迭代器

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

当我们在字符串前面加上const之后,我们发现的代码居然报错了,const对象使用了非const对象的迭代器,查阅文档发现,确实有const迭代器

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

 所以我们对代码进行修改:
【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

嗷嗷通过!!!

小羊注:

const string::iterator it1=s1.begin();

string::const_iterator it1=s1.begin();

这俩种截然不同的写法:

对于第一个迭代器,意思是不修改迭代器的指向,但是我们一般都不这么写,因为迭代器本来就是要往后走的。

对于第二个迭代器,意思是不修改迭代器访问元素的内容

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

5.3迭代器和指针的区别

迭代器(Iterator)和指针(Pointer)是两种不同的概念,尽管它们在某些方面有一些相似之处,但它们在不同的编程语境中使用,具有不同的特性和用途。以下是它们之间的主要区别:

1. 用途:
   - 迭代器:迭代器是一种抽象的数据访问方式,通常用于遍历集合(如数组、列表、映射等)中的元素,迭代器提供了一种通用的方式来访问集合中的元素,不需要了解底层数据结构。
   - 指针:指针是一种变量类型,它存储了内存中某个对象的地址。指针通常用于在低级语言(如C和C++)中进行内存操作,包括直接访问内存地址、动态分配内存等。

2. 安全性:
   - 迭代器:迭代器通常被设计为更安全的方式来遍历集合,因为它们提供了一些保护机制,以避免越界访问和内存错误。不同编程语言中的迭代器可能具有不同的安全性特性。
   - 指针:指针在低级语言中使用时,容易引发内存错误,如空指针引用、越界访问等问题。因此,使用指针需要更谨慎,需要程序员自行确保安全性。

3. 抽象程度:
   - 迭代器:迭代器提供了一种更高级别的抽象,隐藏了底层数据结构的细节。这使得代码更易读和维护,并且有助于降低程序中的错误。
   - 指针:指针是一种低级别的抽象,直接操作内存地址,需要程序员了解内存布局和数据结构的细节。

4. 语言相关性:
   - 迭代器:迭代器通常与高级编程语言(如Python、C#、Java等)一起使用,这些语言提供了内置的迭代器或集合遍历机制。
   - 指针:指针更常见于低级编程语言(如C和C++),这些语言直接支持内存操作,因此需要程序员更深入地了解计算机硬件和内存管理。


六、string之capacity(resize,reserve,clear)

string 中提供了一些对容量进行操作的函数:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

函数名称 函数功能
size() 返回字符串的长度
capacity 返回字符串的容量
empty 判断字符串是否为空

注意:size和capacity是完全俩个不同的函数接口 

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


6.1resize(Resizes the string to a length of n characters) 

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

resize 函数用来调整字符串大小,它一共分为三种情况:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

  • n 小于原字符串的 size,此时 resize 函数会将原字符串的 size 改为 n,也会改变字符串初始值,但不会改变 capacity
  • n 大于原字符串的 size,但小于其 capacity,此时 resize 函数会将 size 后面的空间全部设置为字符 c
  • n 大于原字符串的 capacity,此时 resize 函数会将原字符串扩容,然后将size 后面的空间全部设置为字符 c

情况一(发生截断):

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

情况二(不扩容,但可以进行赋值):

将string的size变成了13,但是并没有扩容

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

情况三(扩容,且进行赋值):

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


6.2reserve预留空间(一般用于扩容)(不会改变size)

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

reserve 用来扩容与预留空间,相当于C语言中的 realloc 函数,它分两种情况:

  • n 大于原字符串的 capacity,此时 reserve 函数会将 capacity 扩容到 n;
  • n 小于等于原字符串的 capacity,标准未规定是否要缩容 (VS下不缩容);
string s1("xiao_yang");
    cout << s1.size() <<endl;
    cout << s1.capacity() << endl << endl;

    s1.reserve(100);//预留100的空间
    cout << "预留后的size与capacity" << endl;
    cout << s1.size() << endl;
    cout << s1.capacity() << endl;

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

 小羊注:reserve 函数不会改变原字符串的 size 以及数据


6.3clear(清空字符串)

clear 函数用来清空字符串,即将 size 改为0,至于是否会改变 capacity,标准也未规定:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


七、string之Element Access(元素访问)

string 提供了一些接口来获取字符串中的单个字符:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

 operator[ ](在上方string的遍历中已经有了详细讲解,这里再回顾回顾)

运算符重载的一种,我们可以通过 opetator[] 来获取与修改字符串中具体下标的字符:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

这里虽然正确输出了,但是为什么箭头这里会有提示呢??

通过查阅文档可知:[ ] 的参数是size_t 也就是unsigned int 所以这里写 int 是不合理的

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


 

八、string之modify(+=,append,insert,erase,swap)

string 提供了一些列用来修改字符串内容的函数:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

8.1operator+=(最牛逼的尾插)

operator+= 是运算符重载的一种,用于向字符串尾插数据,支持尾插一个字符串、尾插一个字符数组以及尾插一个字符:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

string s1("xiao_yang");
    string s2="   hehe   ";

    s1+=s2;cout << s1 << endl;
    s1+="abcabc";cout << s1 << endl;
    s1+='c';cout << s1 << endl;

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

8.2append(尾部追加数据,但是没有+=牛逼)

append 的功能和 operator+= 的功能类似,都是向字符串尾部追加数据:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

8.3insert(任意位置插入)(一般不用,浪费时间)

insert 函数用于向在字符串的 pos 处插入数据:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

#include <iostream>
#include <string>

int main() {
    std::string original_string = "Hello, world!";
    
    // 在字符串的指定位置插入字符或子字符串
    original_string.insert(7, "there, ");
    std::cout << original_string << std::endl;
    // 输出: "Hello, there, world!"

    // 在字符串的末尾插入字符或子字符串
    original_string.insert(original_string.length(), " How are you?");
    std::cout << original_string << std::endl;
    // 输出: "Hello, there, world! How are you?"

    // 在字符串的开头插入字符或子字符串
    original_string.insert(0, "Hi, ");
    std::cout << original_string << std::endl;
    // 输出: "Hi, Hello, there, world! How are you?"

    return 0;
}

8.4erase(任意位置删除)

erase 用来从 pos 位置开始向后删除 len 个字符:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

  这里的npos是一个很有讲究的东西!

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

这里npos特殊就特殊在它的类型值是size_t 不是简单的int 在上方erase的第一个接口len后面,len 的缺省值是 npos,虽然 npos 的值为-1,但是 npos 是无符号数,所以 npos 其实是无符号整形的最大值;所以,如果我们不知道 len,那么 erase 函数会一直往后删除,直到遇到 ‘\0’


【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


8.5 swap(是一个参数,和平常见到的普通的不一样)

swap 函用于交换两个字符串的内容,包括指向的字符数组、有效数据个数以及容量大小:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

string s1("dsjnaiodioasndosdaiosandsaoindsisdaoidnsaionds0asnisdanas");
    string s2;
    cout << "s1原来的size " << s1.size() << endl;
    cout << "s1原来的capacity " << s1.capacity() << endl;
    cout << "s2原来的size " << s2.size() << endl;
    cout << "s2原来的capacity " << s2.capacity() << endl;

    s1.swap(s2);
    cout << endl << endl << endl;
    cout << "s1交换后的size " << s1.size() << endl;
    cout << "s1交换后的capacity " << s1.capacity() << endl;
    cout << "s2交换后的size " << s2.size() << endl;
    cout << "s2交换后的capacity " << s2.capacity() << endl;

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


九、string之operation操作函数(c_str,find,,substr)

string 提供了系列对 string 进行操作的函数:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

9.1c_str(为了使得C++与C语言之间有接口,算是大使馆)

在某些场景中只支持对C形式的字符串,即字符数组进行操作,比如网络传输、fopen,而不支持对C++中的 string 对象进行操作,所以 string 提供了c_str,用于返回C形式的字符串:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    string s1("haha");
    cout << strlen(s1.c_str()) << endl;
    return 0;
}

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


9.2find(查找字符串,里面也有npos)

find 用于返回 一个字符或一个字符数组或一个string对象 在 string 中首次出现的位置,如果找不到就返回 npos:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

#include<iostream>
using namespace std;
int main()
{
    string s1("haha");
    string s2("ah");
    cout << s1.find(s2) << endl;
    cout << s1.find("h") << endl;
    cout << s1.max_size() << endl;
    return 0;
}

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


 

9.3rfind(对于找文件后缀这种问题来说用rfind非常舒服)

find 函数是默认从起始位置开始从前往后找,而 rfind 函数是默认从后往前找:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

 string s1("test.cpp");
    string s2("hehe.c.zip");
    cout << s1.find('.') << endl;
    cout << s2.rfind(".") << endl;

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


9.4find_first_of(找出字符子集第一个出现的位置)

 find_first_of 函数用于返回在 string 找寻找与 字符/字符数组/string 中任意一个字符匹配的元素的位置:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    std::string charactersToFind = "aeiou";  // 要查找的字符集合

    // 使用 find_first_of 查找第一个匹配的字符
    size_t found = str.find_first_of(charactersToFind);

    if (found != std::string::npos) {
        std::cout << "第一个匹配的字符 '" << str[found] << "' 在位置 " << found << " 上找到。" << std::endl;
    } else {
        std::cout << "未找到匹配的字符。" << std::endl;
    }

    return 0;
}

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

 9.5substr(截断字符串并返回)

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

string s1("haha hehe heihei");
    cout << s1.substr(0,s1.size()) << endl;
    cout << s1.substr(5,10) << endl;//从5开始 弄10个
    cout << s1.substr(10,10) << endl;

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl


十、非成员函数的重载函数(getline)

getline在OJ中通常可以大放光彩,因为cin遇到空格就歇菜了:

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

 【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

string s1("haha hehe heihei");
    getline(cin,s1);
    cout << s1 << endl;//

    getline(cin,s1,' ');
    cout << s1 << endl;

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl 


希望这篇文章可以给你们带来帮助!!

【C++】String类基本接口介绍(多看英文文档),小阳c++专栏,c++,stl文章来源地址https://www.toymoban.com/news/detail-724927.html

到了这里,关于【C++】String类基本接口介绍(多看英文文档)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】string的基本使用

    从这篇博客开始,我们的C++部分就进入到了 STL , STL的出现可以说是C++发展历史上非常关键的一步,自此C++和C语言有了较为明显的差别 。那么什么是STL呢? 后来不断的演化,发展成了知名的两个版本, 一个叫做P.J.版本,我们的VS系列就是用的这个版本 ,还有一个叫做 SGI版

    2024年01月20日
    浏览(35)
  • C++ string模拟实现(部分接口)

    C++的string类是一个类模板,用于表示和操作任何字符类型的字符串。 string类内部使用字符数组来存储字符,但是所有的内存管理,分配和空终止都由string类自己处理 ,所以使用起来很方便。string类的长度可以在运行时改变,因为它使用动态内存分配类似于vector。 string类提供

    2024年02月13日
    浏览(38)
  • 探索c++:string常用接口 迷雾

       个人主页: 日刷百题 系列专栏 : 〖C/C++小游戏〗 〖Linux〗 〖数据结构〗   〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​ 这里我们对string类进行一个简单的总结: string是表示字符串的字符串类 该类的接口与常规容器的接口基本相同,再添加了一些专

    2024年04月28日
    浏览(63)
  • 【c++】string类常见接口函数

    🔥个人主页 : Quitecoder 🔥 专栏 : c++笔记仓 朋友们大家好啊, 本节我们来到STL内容的第一部分: string 类接口函数的介绍 给大家分享一个c++文档库: https://legacy.cplusplus.com/ 字符串类是代表字符序列的对象 标准字符串类为这类对象提供了支持,其接口类似于标准字节容器的

    2024年04月16日
    浏览(32)
  • C++ String类的基本使用

            放弃时间的人,时间也会放弃他。——莎士比亚 ; 本篇章是关于string类内一些函数的介绍以及使用方法,都是我们编程必须掌握的基础! ​ 全文共7000字左右. 话不多说安全带系好,发车啦 (建议电脑观看) 。 附:红色,部分为重点部分;蓝颜色为需要记忆的

    2024年02月09日
    浏览(35)
  • [C++] string类常用接口的模拟实现

    string上篇我们实现了 各类构造与赋值重载 接口,点这里看string类的介绍与构造的模拟实现 本篇我们对string常用的接口 增删查改+遍历 模拟实现一下。 以下就是要实现的接口: 这种方式是我们最喜欢使用的一种,使用下标将字符逐个打印出来。 string类的迭代器的底层是一个

    2024年02月11日
    浏览(64)
  • 【C++ STL】string类最全解析(什么是string?string类的常用接口有哪些?)

    目录 一、前言  二、什么是 string ?  💦 string 类的基本概念 💦 string 类与 char * 的区别   💦 string 类的作用  💦 总结  三、string 的常用接口详解  💦string 类对象的默认成员函数 ① 构造函数(初始化) ② 赋值重载(初始化) 💦string 类对象的访问及遍历操作 ① operator[ ]

    2024年04月17日
    浏览(42)
  • c++系列之string类的常用接口函数

    💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 string时表示字符串的字符类 //使用 string类包含#include 头文件 以及 using namespace std string容量相关接口 (size(),capacity(),clear(),empty) 1.size()是元素个数 //. size()与length()方

    2024年02月10日
    浏览(37)
  • 【C++】string介绍

    这篇博客讲的是STL中的string,作为一名C++程序猿,搞懂STL可是非常重要的。这篇博客就是介绍一些string类中比较常用的函数。但重要的不是这,因为记住所有的函数接口是不可能的,而且重要的函数接口就几个。重要的是让大家培养出查文档的习惯。 string类中成员变量大概长

    2024年02月06日
    浏览(30)
  • C++中String归纳,相关接口模拟实现,深度理解

    目录 前言(string简介,及深度理解重要性) 一、string的实例化构造 1.利用string类接口的构造 2.string构造的模拟实现 1、构造函数 2、拷贝构造 二、string的静态变量 1、npos介绍及原理 ​编辑 2、npos模拟 三、string的遍历方法 1、下标遍历 下标方括号模拟 2、迭代器遍历 迭代器及

    2024年02月20日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包