【STL】string类(中)

目录

1,rbegin 和 rend

2,reserve & capacity

3,max_size ( )

4,size()& resize

1,void resize (size_t,char c)

5,push_back & append

1,追加字符串范围

2,直接追加


【STL】string类(中)_第1张图片

1,rbegin 和 rend

具体详情:cplusplus.com/reference/string/string/rbegin/

【STL】string类(中)_第2张图片

#include
#include
using namespace std;

int main()
{
	string s1("hello world");

	string::reverse_iterator it = s1.rbegin();
	while (it != s1.rend())
	{
		cout << *it << " ";
		it++;
	}

	return 0;
}

【STL】string类(中)_第3张图片

其实也就是逆置打印字符串;

而且缺点也很明显,类型太长了不便于书写;

所以 auto 的好用之处就体现出来了,自动帮我们推算类型;

int main()
{
	string s1("hello world");

	//string::reverse_iterator it = s1.rbegin();
	auto it = s1.rbegin();
	while (it != s1.rend())
	{
		cout << *it << " ";
		it++;
	}

	return 0;
}

【STL】string类(中)_第4张图片

这样就更 OK 了;

还有一个冷门不常用的,就是 crengin 代替 rengin ,crend 代替 crend ;

int main()
{
	string s1("hello world");

	//string::reverse_iterator it = s1.crbegin();
	auto it = s1.crbegin();
	while (it != s1.crend())
	{
		cout << *it << " ";
		it++;
	}

	return 0;
}

【STL】string类(中)_第5张图片

2,reserve & capacity

reserve:更改容量,需要多少空间,提前开好即可

capacity:返回空间总大小

【STL】string类(中)_第6张图片

【STL】string类(中)_第7张图片

int main()
{
	string s1;
	string s2("hello world");

	//初始容量大小
	cout << s1.capacity() << endl;
	cout << s2.capacity() << endl;
	cout << endl;

	s1.reserve(20);
	s2.reserve(30);

	//当 n>容量大小
	cout << s1.capacity() << endl;
	cout << s2.capacity() << endl;
	cout << endl;

	s1.reserve(5);
	s2.reserve(5);

	//当 n<容量大小
	cout << s1.capacity() << endl;
	cout << s2.capacity() << endl;

	return 0;
}

【STL】string类(中)_第8张图片

小伙伴们会好奇,为什么扩容的容量不跟我们指定的容量相同;

那是因为编译器有自己的一套扩容机制;

int main()
{
	string s1;
	string s2("hello world");

	int doll = s1.capacity();
	cout << s1.capacity() << endl;
	int i = 1000;
	while (i--)
	{
		s1 += ' ';
		if (doll != s1.capacity())
		{
			cout << s1.capacity() << endl;
			doll = s1.capacity();
		}
	}
	return 0;
}

【STL】string类(中)_第9张图片

基本上是按 1.5 倍扩增的,除了刚开始的;

所以空间容量只会在这些值里面,就算是 16 也直接扩容至下一阶段 31,其实是 32,因为还有一个 ' \0 ' ;

当扩容之后的量大于当前的容量则扩大;

当扩容之后的量小于当前真实容量则不变,否则缩小;

string s2("hello world") 里面的 " hello world " 真实容量就是11;

3,max_size ( )

算出字符串所能开辟的最大空间

int main()
{
	string s1;
	string s2("hello world");

	cout << s1.max_size() << endl;
	cout << s2.max_size() << endl;

	return 0;
}

【STL】string类(中)_第10张图片

由上可得 string类所能开辟的最大空间都是一样的;

但是所能开辟的最大空间并不是真的能开辟,我们来看一段代码;

int main()
{
	string s1;
	string s2("hello world");

	cout << s2.capacity() << endl;
	cout << s2.max_size() << endl;
	 
	s2.reserve(s2.max_size());
	cout << s2.capacity() << endl;

	return 0;
}

【STL】string类(中)_第11张图片

上面开最大空间的容量的时候,运行直接崩溃的,根本开不出来; 

真实的话是开不出来的,这仅供参考,不必当真;

4,size()& resize

size():返回字符串有效长度

resize():将有效字符的个数该成n个,多出的空间用字符 c 填充

【STL】string类(中)_第12张图片

【STL】string类(中)_第13张图片

我们直接来看一段代码

int main()
{
	string s1;
	string s2("hello world");
	
	//打印有效字符长度和容量大小
	cout << s1.size() << " " << s1.capacity() << endl;
	cout << s2.size() << " " << s2.capacity() << endl;
	cout << endl;

	s1.resize(20);
	s2.resize(30);
	
	//有效字符对容量的影响
	cout << s1.size() << " " << s1.capacity() << endl;
	cout << s2.size() << " " << s2.capacity() << endl;
	cout << endl;

	s1.resize(5);
	s2.resize(8);
	//
	cout << s1.size() << " " << s1.capacity() << endl;
	cout << s2.size() << " " << s2.capacity() << endl;
	cout << endl;

	s1.reserve(100);
	s2.reserve(200);

	//容量对有效字符的影响
	cout << s1.size() << " " << s1.capacity() << endl;
	cout << s2.size() << " " << s2.capacity() << endl;


	return 0;
}

【STL】string类(中)_第14张图片

由上可得,有效字符 size 的长度会影响 capacity 容量,但是 capacity 容量的大小不会影响 有效字符 size ;

而且 字符串有效字符长度会随着 size 的变化而变化即使是缩小,但是容量不会改变,以后可以用于【删除数据,保留前 n 个】

1,void resize (size_t,char c)

扩增加尾插

int main()
{
	string s1;
	string s2("hello world");

	s1.resize(10, 'y');
	s2.resize(20,'x');
	cout << s2 << endl;
	cout<< s1 << endl;

	return 0;
}

【STL】string类(中)_第15张图片

这个我们以后可以用作给字符串赋值和初始化;

5,push_back & append

push_back :在字符串后尾插字符c

append:在字符串后追加一个字符串

【STL】string类(中)_第16张图片

【STL】string类(中)_第17张图片

直接上代码:

int main()
{
	string s1;
	string s2("hello world");

	s1.push_back('x');
	s2.push_back('y');
	cout << s1 << endl;
	cout << s2 << endl;
	cout << endl;

	s2.append("hello world");
	s2.append("hello wprld");
	cout << s1 << endl;
	cout << s2 << endl;

	return 0;
}

【STL】string类(中)_第18张图片

1,追加字符串范围

string& append(inputiterator first,inputiterator last);

int main()
{
	string s1("abcdefg");
	string s2("hello world");

	s1.append(s2.begin(), s2.end());
	cout << s1 << endl;
	cout << endl;

	string s3("abcdefg");
	s2.append(++s3.begin(), --s3.end());
	cout << s2 << endl;

	return 0;
}

【STL】string类(中)_第19张图片

直接范围也是可以的,还可以 ++,--;

int main()
{
	string s1;
	string s2("hello world");

	s1.append(s2,2,7);
	s2.append(10, 'x');

	cout << s1 << endl;
	cout << s2 << endl;

	return 0;
}

【STL】string类(中)_第20张图片 指定也是可以的,用法有很多更 string类的用法类似,大家可以去查查文档的各种用法;

2,直接追加

int main()
{
	string s1;
	string s2("hello world");

	s1 += 'x';
	s2 += " abcdefg";
	cout << s1 << endl;
	cout << s2 << endl;

	return 0;
}

【STL】string类(中)_第21张图片

直接 追加也可以,更简便;

【STL】string类(中)_第22张图片

你可能感兴趣的:(C++,c++,算法,开发语言)