c++学习:STL之string类初识

本文介绍了C++中的STL(标准模板库),包括它的概念和主要组件,如迭代器、算法和容器。特别讨论了string类,阐述了学习它的原因,详细讲解了string类的构造、容量操作、元素访问、迭代器使用、修改操作以及各种字符串操作。此外,文中还提供了实例代码来演示这些操作的用法。
摘要由CSDN通过智能技术生成

目录

1.关于STL

1.什么是STL

2.STL的六的组件

2.关于string类的学习

1.为何学习string类

2.何为string类

3.string类对象的构造

4.容量操作

 5.元素访问的操作

6.迭代器(Iterators)

7.修改类的操作

 8.字符串操作


1.关于STL

1.什么是STL

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

在STL中有常用的数据结构以及其他算法等标准模板提供使用,其中接口非常丰富。

2.STL的六的组件

如图:

 其中迭代器,算法,容器这几大组件非常重要,可以看到在其中有我们认识一些算法swap,find,reverse,配接器中的stack,以及今天来学习的的容器中的string。

2.关于string类的学习

1.为何学习string类

在c语言中我们面对字符串有专门的对字符串操作的库函数string.h,而对于c++,沿用c语言的这种方式显然不符合面向对象的思想,并且其中功能并不全面,我们有时候需要自己实现一些函数,且对于字符串我们都是它是以\0结尾的。

于是在c++中引入了string类:

string类是一个字符串类,区别于c语言中的字符串定义,在c++中创建定义字符串有两种方式:

一种是c风格字符串:

所谓C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。

第二种就是c++引入的string类:

c++ string库中定义了string类提供使用者方便定义字符串以及对字符串的一些操作,这是c++特有的一种方式。

2.何为string类

string类是一个模板类,其类的对象是字符串。

string类就是一个字符串类,该类的接口与常规的容器的接口基本相同,另外添加了一些专门用于操作string的常规操作。

其中类中成员函数,迭代器,容量,元素访问,字符串操作,成员常量,非成员函数重载c++中都详细的给出了定义,见字符串 - C++引用 (cplusplus.com)

可以看到string类中有着丰富的功能,对于我们该做到熟练地使用string类。

3.string类对象的构造

在c++中给出了七中不同情况下的构造函数。

 这里给出一般常用的对象的构造:

int main()
{
	string s1;//空字符串构造,默认为空
	cout << s1 << endl;
	string s2("hello world\n");//const string& str  常字符型
	cout << s2 << endl;
	string s3(s2);//拷贝构造
	cout << s3 << endl;
    string s4("hello world",0,5)//截取构造0到5
   cout << s4 << endl;
}

4.容量操作

可以看到对于字符串的一些容量接口

 这里还是介绍常用的:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str("hello world");
	cout << str.size() << endl;//计算字符串大小
	cout << str.length() << endl;//计算字符串长度,包括\0
	cout << str.capacity() << endl;//计算申请空间大小
	str.reserve(100);//预设100个空间,加上本来的
	cout << str.capacity() << endl;
	str.resize(100);//改变字符串大小
	cout << str.size() << endl;
}

 5.元素访问的操作

访问的一些操作如下:

 注意这里的[ ],这里是重载了[ ],以便它能访问类里的字符串,且为常量字符串(一般我们初始化对象时为常量字符串),一般定义在类里面,这里也只对[ ]介绍一下:

int main()
{
	string str("hello world");
	for (int i = 0; i < str.size(); i++)
	{
		cout << str[i] ;
	}
	cout << endl;
	//利用[]访问常量字符串中的每个元素
	//因为在重载时是利用了引用,因此这里还可以修改
	str[1] = 'w';
	cout << str[1];
	//当然在定义string的对象时,对于const 修饰的类型是无法被修改的
	const string str1("hello world");
	//str1[1] = 'w';  报错
}

6.迭代器(Iterators

对于所有的STL中都会有一个迭代器,在这里你可以将迭代器理解为一个变量或者指针,因为要访问顺序容器和关联容器的元素,我们就用迭代器来遍历,读取,它是做为一个媒介,可以指向容器中的某个元素,类似指针的指向。

 这里我们浅浅说一下

int main()
{
	string str("hello world");
	//可以类似定义一个迭代器(可理解为指针)指向容器中的某个元素
	string::iterator i = str.begin();//指向开始的元素
	while (i!=str.end())
	{
		*i = ' x';//当然我们也可以修改迭代器中所保存指向的元素
		cout << *i;
		i++;
	}
	cout << endl;
}

7.修改类的操作

可以看到有很多修改操作,这里也展示一些常用的:

int main()
{
	//push_back  追加一个字符
	string s1("hello world");
	s1.push_back('!');
	cout << s1 << endl;
	//append   追加一个字符串
	s1.append(" haha");
	cout << s1 << endl;
 	//operator+=,重载了+=,作用是追加,这里给了两种函数接口,是综合了前两种的追加
	//操作是两个对象
    //insert   插入
	s1.insert(5, "hello");//在第五个位置处插入
	cout << s1 << endl;
	//c_str  返回字符数组的一个指针,返回类型为const char *
	const char* ch;
	ch = s1.c_str();
	cout << *ch<<endl;

}

 8.字符串操作

这里简单介绍常用的:

int main()
{
	string s1("hello world");
	string s2("hello");
	//查找 find,其返回类型为整形,若查找到了,返回与匹配项相同的第一个字符的位置,否则返回string::npos(一个无符号整型)
	if (s1.find(s2) != string ::npos)
	{
		cout << s2 << "存在于" << s1 << endl;
	}
	else
	{
		cout << s2 << "不存在于" << s1 << endl;
	}
	//这里也可以从给的索引位置查找
	//s1.find(s2,5) != string ::npos 从s2的第五个开始查找、
	//可查找字符,或字符串

	//rfind  从后面往前查找,找到返回位置
	string filename("test.txt.tar.zip");
	size_t pos = filename.rfind(".");
	//substr  取一段子字符串 即截取
	string suffix = filename.substr(pos);//pos处开始截取
	cout << suffix;
}

 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜求佬带

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值