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 ...
随机推荐
- react的this.setState详细介绍
this.setState是react类组件中最常用的一个react API,使用它可以改变state从而改变页面.今天我们就来详细的学习一下这个东西.比如: import React, { Comp ...
- java流程控制语句要点
java流程控制语句要点 一.java7增强后的switch switch语句后面的控制表达式的数据类型只能是byte.short.char.int四种整数类型,不能是boolean类型,java7以 ...
- SQL中行转列(PIVOT)与列转行(UNPIVOT)
一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( ), --学生姓名 ), --科目 [Score] FLOAT, --成绩 ) 执行结果: 2.行转列sql ...
- 十四、 React路由(react-router4.x): 动态路由、get传值、React中使用url模块
概述 新闻列表 -跳转-> 详情页 时,想把列表对应的id传到详情页里,可用到三种传值方法: 1.动态路由传值 2.get传值 3.localstorage传值 一.动态路由传值 [App.js ...
- centos7-虚拟机 主机 互通 静态ip网络设置
由于目前互联网发展的速度之快.用户量之多,很多时候作为服务端单台服务器的硬件配置已经不足以支撑业务.集群.分布式等技术架构变得越来越普及,作为开发人员也有必要掌握相关技能.笔者打算选用virtual ...
- MBE风格图标
图标的定义 图标是一种通过相似性或类比行来代表对象的符号. 图标的重要性 1.图形以其无与伦比的识别性带来信息传达效率的提升. 2.图形以其百变多样的趣味性带来视觉体验的享受提成用户体验. 3.图形以 ...
- 【pwnable.kr】bof
pwnable从入门到放弃,第三题. Download : http://pwnable.kr/bin/bofDownload : http://pwnable.kr/bin/bof.c Runnin ...
- Vulkan 开发学习资料汇总
开发资料汇总 1.API Reference 2.Vulkan Spec 有详细说明的pdf 文章 1.知乎Vulkan-高性能渲染 2.Life of a triangle - NVIDIA's l ...
- 63.Python中contains和icontains
1. contains: 进行大小写敏感的判断,某个字符串是否包含在指定的字段中,这个判断条件使用大小写敏感进行判断,因此在被翻译成"SQL"语句的时候,会使用"like ...
- Vue.js(20)之 封装字母表(是这个名字吗0.0)
HTML结构: <template> <div class="alphabet-container"> <h1>alphabet 组件</ ...