STL
标准模板库,是C++标准库的重要组成部分。
string类
string 动态增长char字符数组 左闭右开
每一个string对象包括但不限于以下函数
string s1;
s1.begin();//第一个元素
s1.end();//最后一个元素的下一个位置
s1.rebegin;//最后一个元素;
s1.rend;//第一个元素的前一个位置
s1.cbegin();//const的begin
s1.cend();//const的end
s.append(str.begin(),str.end());//把str整个拷贝过来
s.append(str.begin()+2,str.end()-2);//拷贝str的一部分
s1.max_size();//这里不管是哪个string对象都是一个固定值
s1.capacity();//目前的s1的容量
s1.reserve(100);//提前开约100个的容量 开空间
s1.resize(100);
s1.resize(100,'x');//开空间加初始化
s2.assign(s1);//s1的内容赋值给是s2
#include <iostream>
#include <string>
using namespace std;
void string1()
{
//创建
string s1;
string s2("hello world !");
string s6(100,'x');//用100个x来初始化
//拷贝
string s3(s2);//将s2的内容拷贝到s3
string s4(s2,6,3);//从s2的下标为6开始拷贝3个数据 最多拷贝到s2结束
string s5("hello world",5);//拷贝5个数据
}
void string2()
{
//赋值
string s1;
string s2=“hello world!!!”;//构造+拷贝构造-->优化为直接构造
s1=s2;
s1="xxxx";//字符串
s1='x';//字符
//越界会崩溃
//遍历String
for(size _t i=0;i<s2.size;i++)
{
cout<<s2[i]<<" ";
}
cout<<endl;
}
void string3()
{
string s1("hello world");
cout<<s1[0]<<endl;//读取下标为0的元素
s1[0]='x';//改写下标为0的元素
//at和[]功能一样 区别是越界抛异常
}
void string4()//迭代器 iterator像指针 用法类似
{
string s("hello");
string::iterator it=s.begin();
while(it!=s.end())//遍历 end是最后一个元素的下一个位置
{
cout<<*it<<" ";
++it;
}
cout<<endl;
//-----迭代器是用法是类似的------------
List<int> lt(10,1);
List<int>::iterator lit=lt.begin();
while(lit!=lt.end())
{
cout<<*lit<<" ";
++lit;
}
cout<<endl;
}
void string5()//反向迭代器 rebegin rend
{
string s("hello");
string::reverse_iterator rit=s.rebegin();
while(rit!=s.rend())//倒着编译
{
cout<<*rit<<" ";
++rit;
}
cout<<endl;
}
void PrintString(const string& str)//常量迭代器
{
string::const_iterator it=str.begin();
while(it!=str.end())
{
cout<<*it<<" ";
it++;
}
cout<<endl;
}//const_reverse_iterator同理
int main()
{
string1();
return 0;
}
#include <iostream>
#include <string>
using namespace std;
void string6()//插入
{
string s("hello");
s.push_back('-');
s.push_back('-');
s.append("world");// hello--world
cout<< s <<endl;
string str("插入")
s+='@';// hello--world@
s+=str;// hello--world@插入
s+="!!!";// hello--world@插入!!!
}
int main()
{
string6();
return 0;
}
例题:(仅仅反转字母)
class Solution
{
public:
bool IsLetter(char ch)
{
if((ch>'a'&&ch<'z')||(ch>'A'&&ch<'Z'))
return true;
else
return false;
}
sting reverseOnlyLetters(string s)
{
size_t begin =0,end=s.size()-1;
while(begin<end)
{
while(begin<end && !IsLetter(s[begin]))
++begin;
while(begin<end && !IsLetter(s[end]))
--end;
swap(s[begin],s[end]);
++begin;
--end;
}
return s;
}
}
库里面有一个找字母的函数
isalpha(char* p)
字符串相加
class Solution
{
public:
string addStrings(string num1,string num2)
{
int end1=num1.size()-1,end2=num2.size()-1;
int next=0;//表示是否进位
string strRet;//用于保存结果
while(end1>=0 || end2 >=0)
{
int val1=end1>=0?num1[end1]-'0':0;
int val2=end2>=0?num2[end2]-'0':0;
int ret=val1+val2+next;
next=ret>9?1:0;
//string类里的头插
//strRet.insert(strRet.begin(),'0'+(ret%10));
//这里采用尾插加逆置
strRet+=('0'+ret%10);
--end1;
--end2;
}
//if(next)
//strRet.insert(strRet.begin(),'1');
if(next==1)
strRet+='1';
//逆置
reverse(strRet.begin(),strRet.end());//给起始位置和结束位置
return strRet;
}
}
范围for
自动迭代,自动判断结束
for(auto ch : s)
{
cout<< ch <<" ";
}
for(auto& ch : s)
{
cout<< ch <<" ";
}
依次取s中每个字符,赋值给ch
for(auto e: lt)//上述的 List<int> lt(10,1);
{
cout << e <<" ";
}
范围for的底层实现就是迭代器