C++修炼之路之string--标准库中的string

目录

前言 

一:标准库的string类简介

1.string是basic_string的一份char类型的类模板

2.basic_string类模板的分类 

 3.string是表示字符串的字符串类

4.在使用string类时要添加头文件#include

二:string类的常用接口(只介绍常用的)

1.构造+析构+赋值重载

2.string类对象的容量操作

sting类中的resize和reserve 

注意事项 

3.string类对象的访问及遍历

[]方式访问

普通迭代器方式访问 

const迭代器方式访问const对象

4.string类对象的修改操作 

追加字符或字符串

查找+替换 +截取

 c_str()返回c形式字符串,遇到'\0'就停下来

5.string类非成员函数

getline是用来读取有空格的一串字符串

使用形式如 string s;   getline(cin,s);

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

前言 

在日常中我们常常会使用字符串来表示一些数据,而在C语言中,字符串是以'\0'结尾的字符的集合,关于字符串的操作在c语言中有着各种str系列的库函数来处理字符串,但有时会因为误用而造成错误,且库函数多不易记住各库函数的的具体操作,因此在c++中提出了string类来解决各种字符串操作

一:标准库的string类简介

1.string是basic_string的一份char类型的类模板

2.basic_string类模板的分类 

发展出不同的类模板 是为了适应各种不同的环境下的使用,比如要兼容各国的语言,字符串表示各国的语言等,就如编码一样,发展了各种的编码来适应各国的语言

最初的ASCII码

我们知道计算机只能识别机器语言,也就是二进制的,对于要在计算机中存储和表示英文就得有对应的转换,这就用到了ASCII码表将其对应的十进制数字表示为二进制的,存储在计算机中

为了兼容各国的语言与文字,便提出了万国码,将各国文字按照对应的转换数字用二进制存储在计算机中

 常用的为UTF-8来转换各国文字

在国内为了更好的兼容,标识和存储汉字便提出了对于汉字的编码

 3.string是表示字符串的字符串类

4.在使用string类时要添加头文件#include <string>

二:string类的常用接口(只介绍常用的)

1.构造+析构+赋值重载

 

举例:

 

2.string类对象的容量操作

注:在capacity计算中是不统计'\0'的

使用 

sting类中的resize和reserve 

1.我们需要了解在vs和g++等不同编译器的扩容情况

int main()
{
	//观察扩容情况
	string s;
	size_t sz = s.capacity();
	cout << "making s grow:\n";
	cout << "capacity change:" << sz << endl;
	for (int i = 0; i < 100; i++)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity change:" << sz << endl;
		}
	}

	return 0;
}

我们知道每次扩容的代价还是挺大的,要是异地扩容的话 ,还要不断的拷贝数据,释放原空间,代价增加,既然这样的话我们可以在知道需要开多少空间的情况下,使用reserve提前开辟空间,减少扩容,提高效率

int main()
{
	//观察扩容情况
	string s;
    s.reserve(100);//提前扩容
	size_t sz = s.capacity();
	cout << "making s grow:\n";
	cout << "capacity change:" << sz << endl;
	for (int i = 0; i < 100; i++)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity change:" << sz << endl;
		}
	}

	return 0;
}

对于 resize

注意事项 

1.clear()只是将string中有效字符清空,不会改变底层的空间大小

2.resize在改变元素个数时,如果增多元素个数,可能会改变底层容量的大小,如果减少元素个数,底层空间总大小不变

3.reserve为string预留空间,不改变有效元素个数,当参数小于底层空间总大小时,reserve不会改变容量大小

3.string类对象的访问及遍历

[]方式访问

 

普通迭代器方式访问 

正向迭代器

简单理解迭代器 就是两个指针如

 

 范围for遍历

string s3("hello world");
for (auto ch : s3)
{
	cout << ch << " ";
}
cout << endl;

反向迭代器

 

 

 

const迭代器方式访问const对象

4.string类对象的修改操作 

 

 

 使用:

追加字符或字符串

查找+替换 +截取

 

对于上面的这个字符串空格替换还可以再优化为 

 

 

 c_str()返回c形式字符串,遇到'\0'就停下来

使用如cout<<s1.c_str()<<endl;   cout<<s1<<endl;后面一个打印字符串的所有内容

5.string类非成员函数

 

以上几个只需了解即可,对于 getline需要注意

getline是用来读取有空格的一串字符串
使用形式如 string s;   getline(cin,s);
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值