STL初识

是什么?

数据结构;
标准模板库,standard template libaray;
里面有定好的容器、算法、迭代器、仿函数、适配器、空间配置器;
最先学容器,string类、vector等;

string类

管理多个字符的数据结构;
本质是一个数组,可以对其进行增删查改;
中的private如果储存的数组指针,指向一个字符串数组,那最字符串最后一定是以’/0’结尾的;

重点掌握其中的:
4大成员函数
构造;
拷贝构造;
赋值;
析构函数出了定义域自动调用的;
举例

string s1;//构造

string s2("hellow");//拷贝构造
string s3("hellow", 1);

string s4(s2);//拷贝构造

//另一种常用的
string s5(5,'a');
cout << s1 << endl << s2 << endl << s3 << endl << s4 << endl << s5;

尾插

尾插push_back只能单个字符
append支持多个字符;
推荐用+=;

string.push_back('1');
string.append('123');

s += '123';

例题:
将字符串’12345’转换为数据12345

//将字符串转换为数值
int main()
{
	string s;
	s.append("12345");

	//将字符串12345转换为12345数值
	int val = 0;
	for (int i = 0; i < s.size(); i++)
	{
		val *= 10;
		val += s[i] - '0';//ascll码相减
	}
	cout << val << endl;
}

注:
如果他本身是个字符串的话,ascall相减后的数值不显示,显示的是ascall对应的字符;
int出来的变量val是可以存1的并且能cout出来;
STL初识_第1张图片

遍历string有哪些方法?

1、for范围:
a从b中按照顺序一个个取值

for(auto a : b)
{
    
}

2、operator[]

string s("asdadas");
for(int i = 0;i < s.size(); i++)
{
    cout << s[i] << endl;
}

3、获取字符首地址,用c字符串的形式遍历
c_str()
一般输出遇到‘/0’就停止了,而这个输出是全部都输出出来;

string s("asdadas");
cout << s.c_str() << endl;

编码表

ascaII码:
ascaII是早期计算机只需表示英文字符用的;
汉字用gbk、utf-8\utf16;
linux 用的是utf-8;

迭代器:

种类:4种,正向迭代器,反向迭代器,const正向,const反向;
**是什么:**是一个容器,string类或者其他类都有,用来遍历一个集合

	//用迭代器
	//写入
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		*it += 1;
		it++;
	}
	//读
	it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}

概念
迭代器定义出来的变量可以看作指针,用的时候和指针一样解引用;
begin(),是指向容器第一个元素,end()是指向末端元素后一个不存在的元素
STL初识_第2张图片

第二种迭代器,倒着的,反向迭代器:

//反向迭代器
void test_string3()
{
	string s1("hellow world");
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		rit++;
	}
}

const迭代器:

void test_string4()
{
	string s1("3456");
	string::const_reverse_iterator crit = s1.crbegin();
	
	int val = 0;
	while(crit != s1.crend())
	{
		//const的crit地址上的内容是不可修改的
		// *crit += 10;
		val *= 10;
		val += *crit - '0';
		crit++;
	}
	cout << val << endl;
}

find

find是找到那个字符的下角标,也就是输出的是size_t类型,就是这个字符在正数第几个位置
rfind是反过来找
例题
1、分离url

//find ,rfind找字符
//如果没有找到就会返回npos
//http://www.cplusplus.com/reference/string/string/?kw=string
//分离url,协议/域名/资源名称
void split_url()
{
	string s1("http://www.cplusplus.com/reference/string/string/?kw=string");
	size_t i1 = s1.find(':');//标记这个字符
	if (i1 != string::npos)//没找到就是i1 == string::nops了
	{
		cout << s1.substr(0, i1) << endl;
	}

	size_t i2 = s1.find('/',i1 + 3);
	if (i2 != string::npos)
	{
		cout << s1.substr(i1+3,i2-(i1+3)) <<endl;//第二个属性是长度len
	}


	cout << s1.substr(i2+1) << endl;
}

2、字符串相加
力扣链接

class Solution {
public:
    string addStrings(string num1, string num2) {

	int end1 = num1.size() - 1,end2 = num2.size() - 1;
	int next = 0;
	string str;

	while (end1 >= 0 || end2 >= 0)
	{
		int val1 = 0, val2 = 0;
		if (end1 >= 0)
			val1 = num1[end1] - '0';
		if (end2 >= 0)
			val2 = num2[end2] - '0';
		int ret = val1 + val2 + next;
		if (ret > 9)
		{
			next = 1;
			ret -= 10;
		}
		else
		{	
			next = 0;
		} 


		str += (ret + '0');
		--end1;
		--end2;

	}

        if(next == 1)
        {
            str += '1';
        }

		reverse(str.begin(), str.end());
        return str;
    }
};

解析
reverse是stl里面的算法,就是逆置;
STL初识_第3张图片
1、+=都是头插;
2、方法是先用个位相加,然后有进位的标记;
3、其中首先他是字符所以减去’0’,ascll码相减就会变成能加减的数值,最后还要转变回来,所以+‘0’;

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