C++语法(8)---- 初识STL以及string

目录

1.STL

2.string

1.string字符串

2.编码介绍

3.string的使用

1.string的构造函数

2.string的迭代器

3.string容量相关 

4.string的位置搜索

5.string的修改操作

6.string operation


1.STL

STL定义:STL是标准模板库,主要实现数据结构和算法。

六大组件:

2.string

1.string字符串

string也是一种模板。

服务于不同编码的标准下,不同字符串类的实现。

2.编码介绍

不同字符对应的其实是一串一串的01二级制,只要在某个规定下,符合一一对应,我们能通过01串找出对应字符,这样的规定就是编码。其中:ASCII码和Unicode码

ASCII:美国信息交换标准代码,解决字母和字符对应的标准码表

Unicode:万国码,将其他国家的字母符号或者字与01码一一对应

解决一一对应的方法:UTF-8,UTF-16,UTF-32

UTF-8:兼容ACSII;支持中文,将常见汉字用两个字节表示,生僻字通过变长字节来表示

UTF-16:不兼容ASCII,起步用两个字节表设计

UTF-32:起步用四个字节表设计

另外中国自己对汉字设计了一套编码:GBK

如果针对的编码是utf8使用string,utf16使用u16string,utf32使用u32string,wstring是宽字符的针对windows服务的。函数接口差不多,只是存储字符的编码表示不同。

3.string的使用

string模板的头文件在string中,命名空间都是std。

#include<string>

1.string的构造函数

void Test1()
{
	string s1;           //1.空数组
	cout << "s1:" << s1 << endl;
	string s2_1("abcdefg");    //2.有参数构造
	cout << "s2_1:" << s2_1 << endl;
	string s2_2 = "xyz";   //2.拷贝构造+构造的类型强转
	cout << "s2_2:" << s2_2 << endl;
	string s3(s2_1, 2, 4); //3.拷贝另一个字符串的某个范围
	cout << "s3:" << s3 << endl;
	string s4_1(s2_2);	 //4.拷贝构造
	string s4_2 = s4_1;	 //4.拷贝构造
	string s5(10, '*');  //5.构造多个相同的字符
	string s6("hello world", 5);  //6.前几个字符中取
	cout << "s6:" << s6 << endl;
}

遍历方式

void Test2()
{
	string s1("1234");

	//1.遍历下标[]
	for (size_t i = 0; i < s1.size(); ++i)
		s1[i]++;
	
	//2.遍历范围for
	for (auto& ch : s1)
		ch--;

    //3.迭代器
	string::iterator begin = s1.begin();
	while (begin < s1.end())
	{
		cout << *begin;
		begin++;
	}
}

2.string的迭代器

迭代器是类似于指针的东西;使用起来也和指针访问差不多,迭代器是通用的访问形式,STL中的其他容器都可以用迭代器的形式来访问

类型:string::iterator

begin():开头第一个字符

end():字符串的末尾\0

begin() +到 end(),顺序往后

类型:string::reverse_iterator

rbegin():字符串的末尾前一个字符

rend():字符串最前面的前一个字符

rbegin() +到 rend(),顺序往前 

类型:string::const_iterator / string::const_reverse_iterator

该类型针对于const修饰的,string里的内容不能写;

void Test3(string& s)
{
	string::iterator it = s.begin();
	while (it < s.end())
	{
		*it += 1;
		cout << *it << " ";
		it++;
	}
	cout << endl;
	string::reverse_iterator rit = s.rbegin();
	while (rit < s.rend())
	{
		*rit -= 1;
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
}

void Test4(const string& s)
{
	string::const_iterator it = s.begin();
	while (it < s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	string::const_reverse_iterator rit = s.rbegin();
	while (rit < s.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
}


int main()
{
	string s = "1234";
	Test3(s);
	Test4(s);
	return 0;
}

c++11提供:cbegin()、cend() / crbegin()、crend();

以只用于被const修饰的string

3.string容量相关 

1.长度

size() / length():功能都是字符串的长度

void Test5()
{
	string s = "hello world";
	cout << s.size() << endl;
	cout << s.length () << endl;
}

2.总空间大小

capacity()

void Test5()
{
	string s = "hello world";
	cout << s.capacity() << endl;
}

3.清理相关

clear():把字符串的数据清空(至于总空间大小是否被清除取决于编译器)

empty():判空

4.缩减容量

shrink_to_fit():把容量降低

5.改变大小和容量

resize():改变字符串内容的大小,如果空间不够会影响空间大小

reserve():改变空间大小,起扩容作用,对字符串的大小不会修改

4.string的位置搜索

[ ]:通过数组的形式找字符串元素的位置,越界报错

at:获取指定位置的地址,找不到抛异常

front:第一个元素的位置

back:最后一个元素的位置

5.string的修改操作

push_back:尾插一个字符

append:尾插字符串

 +=:运算符重载,尾插字符串

insert:在某个位置插入

 

erase:在某个位置删除

如果传入的删除数多了,那么有多少删多少。

 

insert和erase最好少调用,因为从实现代码角度,他们不仅仅加或者删了东西,还改变了其他内容的位置,其时间复杂度为O(N^2),降低效率所以不推荐 

assign:全部清空,替换赋值

replace:替换

assgin和replace;一个是全部替换,一个是部分替换

replace不建议多用,理由和insert、erase一样,效率太低 

6.string operation

c_str:返回底层指针

find:找到字符串的第一个指定字符,如果找不到返回string::npos

rfind:倒着找对应字符

substr:取子字符串

<<:流插入

>>:流提取

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

灼榆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值