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 ...
随机推荐
- DRF项目之通过业务逻辑选择数据集和序列化器
在REST后台开发中,我们需要通过业务逻辑来选择数据集或者序列化器. 选择数据集: # 重写get_queryset实现通过业务逻辑选择指定数据集 def get_queryset(self): '' ...
- 一百一十二、SAP的OO-ALV之六,复制一个工程的工具栏到另外一个工程的工具栏
一.我们输入SE38,查看一个SAP的标准查询 二.可以看到这个程序拥有一个标准的工具栏 三.我们来到, 输入这个程序名,再点状态 四.把工具栏复制过来 五.弹出的窗口点对勾 六.系统提示已经复制 七 ...
- 八十八、SAP中ALV事件之二,事件的定义和事件子例程
一.我们来到SE37,找到REUSE_ALV_EVENTS_GET相关的定义 二.我们需要用到下面这3个事件 三.我们添加一个第五步,并把显示ALV座位第六步.在第五步中定义三个事件 四.在末尾,添加 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 引用
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的 ...
- Linux预习第三章节《重定向与管道符》20200219
- oracle(4)----空值说明
1. 含义:空值(null)表示未知或者暂时不存在的数据,任何类型(没有约束的条件下)都可以取值null:2. 插入null值: insert into stu (id,name) values(3, ...
- IBGP的自己下一跳,指定源命令。
neighbor router-id update-source loopback int 当两者并不是以物理接口为搭建邻居的时候,就得使用指定源,充当TCP接口. neighbor router-i ...
- 创建了以个vagrant box centos php7 nginx swoole git
php7.2.9 centos7 nginx.1.16 swoole4.4.4 下载地址 链接:https://pan.baidu.com/s/14p7xIa0ZZigRuYvZxnMsYA 提取 ...
- QSignalMapper is deprecated
今天参考 qt4 的书籍,在 qt5 的平台上面,用了 QSignalMapper,结果收到警告" QSignalMapper is deprecated". 经过一番查找,找到了 ...
- IDEA控制台输出中文乱码日志文件正常
控制台中文输出乱码但输出的日志文件正常 idea.exe.vmoptions与idea64.exe.vmoptions已经配置 -Dfile.encoding=UTF-8 logback.xml中也配 ...