65)STL中string的知识

1)代码展示: string是一个类,只不过封装了 char* 而且还封装了 很多的字符串操作函数

2)string类的初始化:
string的构造函数
² 默认构造函数:
string(); //构造一个空的字符串string s1。
² 拷贝构造函数:
string(const string &str); //构造一个与str一样的string。如string s1(s2)。
² 带参数的构造函数
string(const char *s); //用字符串s初始化
string(int n,char c); //用n个字符c初始化
#include<iostream> #include<string>
using namespace std;
//字符串对象的初始化
void hanshu()
{
string s1="dhajds";
string s2=string("dhskad");
string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
string s4=string('a',);//用4个a对s4进行初始化
}
4)字符串的遍历
总共是三种,其中那个at()是可以抛出异常,我们可以捕捉的:
#include<iostream> #include<string>
using namespace std;
//字符串对象的初始化
void hanshu()
{
string s1="dhajds";
string s2=string("dhskad");
string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
string s4=string('a',);//用4个a对s4进行初始化
}
//字符串的遍历
void bianli(string s)
{
//第一种,因为字符串重载了数组操作符 所以可以像遍历数组那样,进行遍历 //数组方式
cout<<"数组方式来进行遍历字符串"<<endl;
for(int i=;i<s.length();i++)
{
cout<<s[i]<<endl;
} ///第二种是 通过迭代器
cout<<"迭代器方式来进行遍历字符串"<<endl;
for(string::iterator t=s.begin();t<s.end();t++)
{
cout<<*t<<endl;
} //第三种,用at方式
cout<<"用at方式遍历字符串"<<endl;
try{
for(int i=;i<s.length();i++)
{
cout<<s.at(i)<<endl;//抛出异常
}
}
catch(...){
cout<<"发出异常"<<endl;
} }
int main()
{
string s="abcdefghijklmn";
bianli(s);
return ;
}
然后 ,加入我的代码发生了问题,比如 我的 数组遍历方式有问题
#include<iostream> #include<string>
using namespace std;
//字符串对象的初始化
void hanshu()
{
string s1="dhajds";
string s2=string("dhskad");
string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
string s4=string('a',);//用4个a对s4进行初始化
}
//字符串的遍历
void bianli(string s)
{
//第一种,因为字符串重载了数组操作符 所以可以像遍历数组那样,进行遍历 //数组方式
cout<<"数组方式来进行遍历字符串"<<endl;
for(int i=;i<s.length()+;i++)//我这里i多了3,越界了
{
cout<<s[i]<<endl;
} }
int main()
{
string s="abcdefghijklmn";
bianli(s);
return ;
}
最后结果展示 直接代码崩掉
然后你再看我的at(),有异常抛出的代码处理问题的方式:
#include<iostream> #include<string>
using namespace std;
//字符串对象的初始化
void hanshu()
{
string s1="dhajds";
string s2=string("dhskad");
string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
string s4=string('a',);//用4个a对s4进行初始化
}
//字符串的遍历
void bianli(string s)
{
//第三种,用at方式
cout<<"用at方式遍历字符串"<<endl;
try{
for(int i=;i<s.length()+;i++)
{
cout<<s.at(i)<<endl;//抛出异常
}
}
catch(...){
cout<<"发出异常"<<endl;
} }
int main()
{
string s="abcdefghijklmn";
bianli(s);
return ;
}
结果展示:

5)字符串:字符指针和string类的转换

copy 不会在 拷贝的字符后面加 '\0' 所以 要自己加上,而且 最好 char buf【128】={0},这样初始化
6)字符串的赋值
string &operator=(const string &s);//把字符串s赋给当前的字符串
string &assign(const char *s); //把字符串s赋给当前的字符串
string &assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
string &assign(const string &s); //把字符串s赋给当前字符串
string &assign(int n,char c); //用n个字符c赋给当前字符串
string &assign(const string &s,int start, int n); //把字符串s中从start开始的n个字符赋给当前字符串
7)字符串的拼接:
string &operator+=(const string &s); //把字符串s连接到当前字符串结尾
string &operator+=(const char *s);//把字符串s连接到当前字符串结尾
string &append(const char *s); //把字符串s连接到当前字符串结尾
string &append(const char *s,int n); //把字符串s的前n个字符连接到当前字符串结尾
string &append(const string &s); //同operator+=()
string &append(const string &s,int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string &append(int n, char c); //在当前字符串结尾添加n个字符c
8)与字符串比较
int compare(const string &s) const; //与字符串s比较
int compare(const char *s) const; //与字符串s比较
compare函数在>时返回 ,<时返回 -,==时返回 。比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的A比小写的a小。
9)字符串的子串
string substr(int pos=0, int n=npos) const; //返回由pos开始的n个字符组成的子字符串
string s="abcdefghijklmn";
cout<<s.substr(,)<<endl;
10)字符串的查找和替换
查找
int find(char c,int pos=) const; //从pos开始查找字符c在当前字符串的位置
int find(const char *s, int pos=) const; //从pos开始查找字符串s在当前字符串的位置
int find(const string &s, int pos=) const; //从pos开始查找字符串s在当前字符串中的位置
find函数如果查找不到,就返回-
int rfind(char c, int pos=npos) const; //从pos开始从后向前查找字符c在当前字符串中的位置
int rfind(const char *s, int pos=npos) const;
int rfind(const string &s, int pos=npos) const;
//rfind是反向查找的意思,如果查找不到, 返回-1 替换
string &replace(int pos, int n, const char *s);//删除从pos开始的n个字符,然后在pos处插入串s
string &replace(int pos, int n, const string &s); //删除从pos开始的n个字符,然后在pos处插入串s
void swap(string &s2); //交换当前字符串与s2的值 //4 字符串的查找和替换
void main25()
{
string s1 = "wbm hello wbm 111 wbm 222 wbm 333";
size_t index = s1.find("wbm", );
cout << "index: " << index; //求itcast出现的次数
size_t offindex = s1.find("wbm", );
while (offindex != string::npos)
{
cout << "在下标index: " << offindex << "找到wbm\n";
offindex = offindex + ;
offindex = s1.find("wbm", offindex);
} //替换
string s2 = "wbm hello wbm 111 wbm 222 wbm 333";
s2.replace(, , "wbm");
cout << s2 << endl; //求itcast出现的次数
offindex = s2.find("wbm", );
while (offindex != string::npos)
{
cout << "在下标index: " << offindex << "找到wbm\n";
s2.replace(offindex, , "WBM");
offindex = offindex + ;
offindex = s1.find("wbm", offindex);
}
cout << "替换以后的s2:" << s2 << endl;
}
11)字符串的区间删除和插入
string &insert(int pos, const char *s);
string &insert(int pos, const string &s);
//前两个函数在pos位置插入字符串s
string &insert(int pos, int n, char c); //在pos位置 插入n个字符c string &erase(int pos=, int n=npos); //删除pos开始的n个字符,返回修改后的字符串
12)字符串的算法相关
void main27()
{
string s2 = "AAAbbb";
transform(s2.begin(), s2.end(), s2.begin(), toupper);
cout << s2 << endl; string s3 = "AAAbbb";
transform(s3.begin(), s3.end(), s3.begin(), tolower);
cout << s3 << endl;
}
65)STL中string的知识的更多相关文章
- STL 中 string 的使用
赋值 string 类型变量可以直接赋值 str = "string"; // str 是 一个 string 类型变量 //等价于 str.assign("string ...
- STL中map用法
Map是 STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于 这个特性,它完成有可能在我们处理一对一数据的 ...
- (转载) STL中map用法详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...
- c++中string (MFC)
题目:UVALive - 6439 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid= ...
- STL之map基础知识
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...
- STL库中string类内存布局的探究
在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...
- Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- 学习一下 JVM (二) -- 学习一下 JVM 中对象、String 相关知识
一.JDK 8 版本下 JVM 对象的分配.布局.访问(简单了解下) 1.对象的创建过程 (1)前言 Java 是一门面向对象的编程语言,程序运行过程中在任意时刻都可能有对象被创建.开发中常用 new ...
- STL中map与hash_map容器的选择收藏
这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...
随机推荐
- AFNetworking实现表单(multipart)形式上传图片
最近遇到个问题,就是上传图片到服务器,后台说用表单形式... 由于没弄过这种上传,所以搜了大堆资料,但也没解决问题. 最后通过请教一位大神才得以解决这个简单的问题... 现在将此方法做个笔记... & ...
- select2 智能补全模糊查询select2的下拉选择框使用
我们在上篇文章中已经在SpringMVC基础框架的基础上应用了BootStrap的后台框架,在此基础上记录select2的使用. 应用bootstrap模板 基础项目源码下载地址为: SpringMV ...
- Spring Cloud Alibaba:Sentinel实现熔断与限流
一.什么是Sentinel Sentinel,中文翻译为哨兵,是为微服务提供流量控制.熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩效应”,为微服务系统提供了稳 ...
- mock的使用及取消,node模仿本地请求:为了解决前后端分离,用户后台没写完接口的情况下
借鉴:https://www.jianshu.com/p/dd23a6547114 1.说到这里还有一种是配置node模拟本地请求 (1)node模拟本地请求: 补充一下 [1]首先在根目录下建一个d ...
- MFC双缓冲
大家都知道包括windows桌面在内我们看到的一切都是系统画上去的,windows桌面就相当于一个黑板: <1>普通绘图就是直接在我们看得到的黑板上绘图 <2>双缓冲就是先在一 ...
- CMenu类中禁用/变灰某一项
CMenu::EnableMenuItem 启用. 禁用,或变暗的菜单项. UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable); 参数 ...
- tableau创建定量值地图
一.官方案例:定量值地图的创建 数据形式: 过程: 分别双击经纬度(默认的纬度会自动添加到行功能区,经度到列功能区) 将Id放入标记卡详细信息 将Magnitude^10(震级^10)放入大小,(该 ...
- 汇编,寄存器,内存,mov指令
一.代码 和 汇编 和 二进制之间的关系 二.复习一下计算机组成原理的知识 1.寄存器 计算机中有三个存储 32位cpu提供的寄存器有三种类型8位 16位 32位 64位的只是32位的扩展 并且程序大 ...
- 第7章,c语言控制语句:分支和跳转
7.1 if语句 通用形式:if(expression) statment 7.2 if else语句 通用形式:if(expression) startment else startment2 7. ...
- bugku-杂项 convert
打开题目文件,一大堆01码,用py转换成hex f=open("in.txt","r") print hex(int(str(f.read()),2)) f.c ...