数据结构;
标准模板库,standard template libaray;
里面有定好的容器、算法、迭代器、仿函数、适配器、空间配置器;
最先学容器,string类、vector等;
管理多个字符的数据结构;
本质是一个数组,可以对其进行增删查改;
中的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出来;
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()是指向末端元素后一个不存在的元素
第二种迭代器,倒着的,反向迭代器:
//反向迭代器
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是找到那个字符的下角标,也就是输出的是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里面的算法,就是逆置;
1、+=都是头插;
2、方法是先用个位相加,然后有进位的标记;
3、其中首先他是字符所以减去’0’,ascll码相减就会变成能加减的数值,最后还要转变回来,所以+‘0’;