65)STL中string的知识

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

        

2)string类的初始化:

      string的构造函数

          2  默认构造函数:

              string();       //构造一个空的字符串string s1。

          2  拷贝构造函数:

              string(const string &str);         //构造一个与str一样的string。如string s1(s2)。

          2  带参数的构造函数

            string(const char *s);    //用字符串s初始化

          string(int n,char c);    //用n个字符c初始化

 1 #include<iostream>
 2
 3 #include<string>
 4 using namespace std;
 5 //字符串对象的初始化
 6 void hanshu()
 7 {
 8     string s1="dhajds";
 9     string s2=string("dhskad");
10     string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
11     string s4=string(‘a‘,4);//用4个a对s4进行初始化
12 }

4)字符串的遍历

    总共是三种,其中那个at()是可以抛出异常,我们可以捕捉的:
  

 1 #include<iostream>
 2
 3 #include<string>
 4 using namespace std;
 5 //字符串对象的初始化
 6 void hanshu()
 7 {
 8     string s1="dhajds";
 9     string s2=string("dhskad");
10     string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
11     string s4=string(‘a‘,4);//用4个a对s4进行初始化
12 }
13 //字符串的遍历
14 void bianli(string s)
15 {
16     //第一种,因为字符串重载了数组操作符  所以可以像遍历数组那样,进行遍历
17
18     //数组方式
19     cout<<"数组方式来进行遍历字符串"<<endl;
20     for(int i=0;i<s.length();i++)
21     {
22     cout<<s[i]<<endl;
23     }
24
25     ///第二种是  通过迭代器
26     cout<<"迭代器方式来进行遍历字符串"<<endl;
27     for(string::iterator t=s.begin();t<s.end();t++)
28     {
29         cout<<*t<<endl;
30     }
31
32     //第三种,用at方式
33     cout<<"用at方式遍历字符串"<<endl;
34     try{
35             for(int i=0;i<s.length();i++)
36             {
37                 cout<<s.at(i)<<endl;//抛出异常
38             }
39         }
40     catch(...){
41         cout<<"发出异常"<<endl;
42     }
43
44 }
45 int main()
46 {
47     string s="abcdefghijklmn";
48     bianli(s);
49     return 0;
50 }

      然后 ,加入我的代码发生了问题,比如  我的  数组遍历方式有问题

 1 #include<iostream>
 2
 3 #include<string>
 4 using namespace std;
 5 //字符串对象的初始化
 6 void hanshu()
 7 {
 8     string s1="dhajds";
 9     string s2=string("dhskad");
10     string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
11     string s4=string(‘a‘,4);//用4个a对s4进行初始化
12 }
13 //字符串的遍历
14 void bianli(string s)
15 {
16     //第一种,因为字符串重载了数组操作符  所以可以像遍历数组那样,进行遍历
17
18     //数组方式
19     cout<<"数组方式来进行遍历字符串"<<endl;
20     for(int i=0;i<s.length()+3;i++)//我这里i多了3,越界了
21     {
22     cout<<s[i]<<endl;
23     }
24
25 }
26 int main()
27 {
28     string s="abcdefghijklmn";
29     bianli(s);
30     return 0;
31 }

    最后结果展示  直接代码崩掉

然后你再看我的at(),有异常抛出的代码处理问题的方式:
  

 1 #include<iostream>
 2
 3 #include<string>
 4 using namespace std;
 5 //字符串对象的初始化
 6 void hanshu()
 7 {
 8     string s1="dhajds";
 9     string s2=string("dhskad");
10     string s3=string(s1);//此时s3和s1是一样的,将s3内容复制一份给了s3
11     string s4=string(‘a‘,4);//用4个a对s4进行初始化
12 }
13 //字符串的遍历
14 void bianli(string s)
15 {
16     //第三种,用at方式
17     cout<<"用at方式遍历字符串"<<endl;
18     try{
19             for(int i=0;i<s.length()+3;i++)
20             {
21                 cout<<s.at(i)<<endl;//抛出异常
22             }
23         }
24     catch(...){
25         cout<<"发出异常"<<endl;
26     }
27
28 }
29 int main()
30 {
31     string s="abcdefghijklmn";
32     bianli(s);
33     return 0;
34 }

      结果展示:
    

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

    

      

     copy 不会在 拷贝的字符后面加 ‘\0‘  所以  要自己加上,而且  最好 char buf【128】={0},这样初始化

6)字符串的赋值

    

1 string &operator=(const string &s);//把字符串s赋给当前的字符串
2 string &assign(const char *s); //把字符串s赋给当前的字符串
3 string &assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
4 string &assign(const string &s);  //把字符串s赋给当前字符串
5 string &assign(int n,char c);  //用n个字符c赋给当前字符串
6 string &assign(const string &s,int start, int n);  //把字符串s中从start开始的n个字符赋给当前字符串

7)字符串的拼接:

1 string &operator+=(const string &s);  //把字符串s连接到当前字符串结尾
2 string &operator+=(const char *s);//把字符串s连接到当前字符串结尾
3 string &append(const char *s);    //把字符串s连接到当前字符串结尾
4 string &append(const char *s,int n);  //把字符串s的前n个字符连接到当前字符串结尾
5 string &append(const string &s);   //同operator+=()
6 string &append(const string &s,int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
7 string &append(int n, char c);   //在当前字符串结尾添加n个字符c

8)与字符串比较

1 int compare(const string &s) const;  //与字符串s比较
2 int compare(const char *s) const;   //与字符串s比较
3 compare函数在>时返回 1,<时返回 -1,==时返回 0。比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的A比小写的a小。

9)字符串的子串

      string substr(int pos=0, int n=npos) const;    //返回由pos开始的n个字符组成的子字符串

1 string s="abcdefghijklmn";
2 cout<<s.substr(0,4)<<endl;

10)字符串的查找和替换

 1 查找
 2 int find(char c,int pos=0) const;  //从pos开始查找字符c在当前字符串的位置
 3 int find(const char *s, int pos=0) const;  //从pos开始查找字符串s在当前字符串的位置
 4 int find(const string &s, int pos=0) const;  //从pos开始查找字符串s在当前字符串中的位置
 5 find函数如果查找不到,就返回-1
 6 int rfind(char c, int pos=npos) const;   //从pos开始从后向前查找字符c在当前字符串中的位置
 7 int rfind(const char *s, int pos=npos) const;
 8 int rfind(const string &s, int pos=npos) const;
 9 //rfind是反向查找的意思,如果查找不到, 返回-1
10
11 替换
12 string &replace(int pos, int n, const char *s);//删除从pos开始的n个字符,然后在pos处插入串s
13 string &replace(int pos, int n, const string &s);  //删除从pos开始的n个字符,然后在pos处插入串s
14 void swap(string &s2);    //交换当前字符串与s2的值
15
16 //4 字符串的查找和替换
17 void main25()
18 {
19     string s1 = "wbm hello wbm 111 wbm 222 wbm 333";
20     size_t index = s1.find("wbm", 0);
21     cout << "index: " << index;
22
23
24     //求itcast出现的次数
25     size_t offindex = s1.find("wbm", 0);
26     while (offindex != string::npos)
27     {
28         cout << "在下标index: " << offindex << "找到wbm\n";
29         offindex = offindex + 1;
30         offindex = s1.find("wbm", offindex);
31     }
32
33     //替换
34     string s2 = "wbm hello wbm 111 wbm 222 wbm 333";
35     s2.replace(0, 3, "wbm");
36     cout << s2 << endl;
37
38     //求itcast出现的次数
39     offindex = s2.find("wbm", 0);
40     while (offindex != string::npos)
41     {
42         cout << "在下标index: " << offindex << "找到wbm\n";
43         s2.replace(offindex, 3, "WBM");
44         offindex = offindex + 1;
45         offindex = s1.find("wbm", offindex);
46     }
47     cout << "替换以后的s2:" << s2 << endl;
48 }

11)字符串的区间删除和插入

1 string &insert(int pos, const char *s);
2 string &insert(int pos, const string &s);
3 //前两个函数在pos位置插入字符串s
4 string &insert(int pos, int n, char c);  //在pos位置 插入n个字符c
5
6 string &erase(int pos=0, int n=npos);  //删除pos开始的n个字符,返回修改后的字符串

12)字符串的算法相关

 1 void main27()
 2 {
 3     string s2 = "AAAbbb";
 4     transform(s2.begin(), s2.end(), s2.begin(), toupper);
 5     cout << s2 << endl;
 6
 7     string s3 = "AAAbbb";
 8     transform(s3.begin(), s3.end(), s3.begin(), tolower);
 9     cout << s3 << endl;
10 }

原文地址:https://www.cnblogs.com/xiaoyoucai/p/8283293.html

时间: 2024-10-25 12:05:43

65)STL中string的知识的相关文章

STL中的map用法详解

STL中map用法详解 说明:如果你具备一定的C++ template知识,即使你没有接触过STL,这个文章你也应该可能较轻易的看懂.本人水平有限,不当之处,望大家辅正. 一.map概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),

C++中的STL中map用法详解

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处. 下面举例说明什么是一对一的数据映射.比如一个班级中,每个学生的学号跟他的姓名就存在着一一

STL中常用的vector,map,set 用法

STL中常用的vector,map,set 用法 C++的标准模板库(Standard Template Library,简称STL)是一个容器和算法的类库.容器往往包含同一类型的数据.STL中比较常用的容器是vector,set和map,比较常用的算法有Sort等. . 一. vector 1.声明: 一个vector类似于一个动态的一维数组. vector中可以存在重复的元素! vector<int> a;          // 声明一个元素为int类型的vector a vectot&

Java中String的基础知识

Java中String的基础知识 ==与equal的区别 基本数据类型,指的是java中的八种基本数据结构(byte,short,char,int,long,float,double,boolean),一般的比较是使用的 ==,比较的是他们的值. 复合数据类型(类) ==比较的是两个对象的引用,可以理解为在内存中的地址,除非是同一个new出来的对象,他们的 ==为true,否则,都为false. equal是object中的方法.object中的实现如下,内部还是使用==实现,也就是说,如果一个

[经典面试题][百度]c++实现STL中的string类

题目 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能. 代码 /*------------------------------------- * 日期:2015-03-31 * 作者:SJF0115 * 题目: 实现string类 * 来源:百度 * 博客: ------------------------------------*/ #include <iostream> #include <cstring> us

STL库中string类的探究

在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符串被存储在了_Buf当中,_Mysize和_Myres就不用说了,就是上面的size 和 capacity 的值. 当只有一个字符作为字符串的时候,就可以很明显的看出来了,_Mysize是指字符串的length _Myres还是没有改变,_Myres最大就是15么? 此时还没有变化,再加入一个字符

Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)

java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在Abstra

STL中的vector 和list

参考书目:visual c++ 入门经典 第七版 Ivor Horton著 第十章 认识两个容器:vector和list 容器:是STL(Standard Template Library 标准模板库)的六大组件之一.(容器,容器适配器,迭代器,算法,函数对象,函数适配器) 容器是用来存储和组织其他对象的对象.提供要存储的对象的类型就可以从STL模板中创建容器类. Vector <T>:表示一个在必要时刻可增加容量的数组,该数组存储T类型的元素.只能在矢量容器的末尾添加新元素. Vector

STL中map与hash_map容器的选择

[转]STL中map与hash_map容器的选择 先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题! 实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的.做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了.今天改进代码,顺便又来温习基础功课了. 还记得Herb Sutter那极有味道的<C++对话系列>么,在其中<产生真正的hash对象>这个故事里就讲了map的选择.顺便回顾一下,也讲一下我在实用中