C++string类(详解)

1.什么是string类

 string是一个C++自己库里面定义的一个类类型,它的内部结构如下。

class STring
{
public:
	STring(const char* str = "")//默认构造函数
	{
		capacity = strlen(str);
		_str = new char[capacity + 1];
		size = capacity;
		strcpy(_str, str);
	}
	STring(const STring& s)//拷贝构造函数
	{
		delete[]_str;
		capacity = s.capacity;
		_str = new char[capacity + 1];
		size = s.size;
		strcpy(_str, s._str);
	}
	//其它库函数....
	~STring()//析构函数
	{
		free(_str);
		capacity = 0;
		size = 0;
	}
private:
	char* _str;//指向字符串的指针
	int capacity;//空间容量
	int size;//内存大小
};

 它和c语言中的char类型差不多,也是用于定义字符串,但是C++引入string可以更好的对字符串进行操控,使用string必须包含#include头文件以及using namespace std;

2.auto的用法 

auto是类型指示符用来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

 

上述将int 类型的变量赋值给auto类型的  j  ,auto自动识别  i  的类型来定义  j  。 

 1.auto使用注意

 用auto声明指针类型的时候,用auto和auto*没有任何区别

 auto引用类型的时候必须加&

 

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只能对一个类型进行推导,然后用推导出来的类型定义其它变量 

auto不能作为函数参数,但能做返回值,但不建议这样使用。

 

  

auto不能用来声明数组 

3.范围for的用法

 对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错。因此C++中引入了基于范围的for循环。for循环后的括号由冒号:分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。

1.for用法示例(看一遍就懂了)

int main()
{
	int array[5] = { 0,1,2,3,4 };
	char arr[] = "ABCDEFG";
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
	{
		array[i] = array[i] * 2;
	}
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
	{
		cout << array[i] << " ";
	}
	cout << endl;
	for (auto i : array)
	{
		cout << i << " ";
	}
	cout << endl;
	for (auto& j : array)
	{
		cout << j << " ";
	}
	cout << endl;

	for (auto p : arr)
	{
		cout << p << " ";
	}
}

就是自动遍历,不需要和C语言一样需要程序员去判断条件什么的,直接给名字,for就会自动从这个首位置到末尾的位置 

4.string类的常见接口

1.string类对象常见构造

constructor功能说明
string()重点构造空的string类对象,即空字符
string(congst char*s)(重点)用C-string来构造string对象
string(size_t n,char c)string类对象中包含n个字符c
string(const string & s)拷贝构造函数
using namespace std;
int main()
{
	string st0;
	string st1("ABCDEFG");
	string st2(9, 'O');
	string st3(st1);
	cout << st0 << endl;
	cout << st1 << endl;
	cout << st2 << endl;
	cout << st3 << endl;

}

2.string类对象的容量操作

函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity

返回空间大小

empty(重点)

检测字符串释放为空串,是返回true,否则返回false

clear(重点)清空有效字符
reserve(重点)为字符串预留空间**
resize(重点)将有效字符的个数改成n个,多出的空间用字符c填充

 

注意:

1.size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size() 

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

3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用'\0'来填充多出的元素空间,resize(size_t n,char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

4.reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。 

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

函数名称功能说明
operator[](重点)返回pos位置的字符,const string类对象调用
beginbegin获取一个字符的迭代器
endend获取最后一个字符下一个位置的迭代器
rbegin指向最后一个字符
rend指向第一个字符之前的理论元素
范围for上面有介绍,C++支持更简洁的范围for的新遍历方式

注意 

rbegin加1时会往头部进行移动

rend+1时会往尾部进行移动 

#include<iostream>
using namespace std;
int main()
{
	string st1("ABCDEFGHIJKLM");
	auto it0 = st1.begin();
	while (it0!=st1.end())
	{
		cout << *it0;
		it0++;
	}
	cout << endl;
	auto it1 = st1.end();
	while (it1!=st1.begin())
	{
		it1--;
		cout << *it1;
	}
	cout << endl;
	auto it2 = st1.rbegin();
	while (it2!=st1.rend())
	{
		cout << *it2;
		it2++;
	}
	cout << endl;
	auto it3 = st1.rend();
	while (it3!=st1.rbegin())
	{
		it3--;
		cout << *it3;
	}
}

 4.string类对象的修改操作 

函数名称功能说明
push_back在字符串后尾插一个字符c
append在字符串后追加一个字符串
operator+=(重点)在字符串后追加字符串str
c_str(重点)返回char格式字符串
find(char c,size_t pos = 0)(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind(char c,size_t pos = npos)从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr(size_t pos,size_t pos=npos)在str中从pos位置开始,截取n个字符,然后将其返回
#include<iostream>
using namespace std;
int main()
{
	string st1("ABCDEFGHIJKLM");
	st1.push_back('NOPQ');
	cout << st1 << endl;
	st1.append("RST");
	cout << st1 << endl;
	st1 += "UVW";
	cout << st1 << endl;
	char* ch = new char[st1.capacity() + 1];
	strcpy(ch, st1.c_str());
	cout << ch << endl;
	cout << st1.find('B',1)<< endl;
	cout << st1.rfind('B', 5) << endl;
	cout << st1.substr(1, 5) << endl;
}

 5.string类非成员函数

函数功能介绍
operator+尽量少用因为传值返回,会导致深拷贝
operator>>(重点)输入运算符重载
operator<<(重点)输出运算符重载
getline获取一行字符串

 

 

 

>>遇到空格停止输入,getline遇到空格也照样输入 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值