String容器

时间:2019-08-16
本文章向大家介绍String容器,主要包括String容器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

摘要:本文主要介绍了字符串string容器的使用。

1、简单介绍

1.1概念

C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件<string>。

1.2 String和c风格字符串的比较

  • Char*是一个指针,String是一个类,string封装了char*,管理这个字符串,是一个char*型的容器。
  • String封装了很多实用的成员方法,包括:查找find,拷贝copy,删除delete 替换replace,插入insert等。
  • 每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。

2、String类的使用总结

2.1 构造函数

string() 创建一个空的字符串 例如: string str
string(const string& str)

使用一个string对象初始化另一个string对象

string(const char* s) 使用字符串s初始化
string(int n, char c) 使用n个字符c初始化

2.2 string基本赋值操作

string& operator=(const char* s) char*类型字符串 赋值给当前的字符串
string& operator=(const string &s) 把字符串s赋给当前的字符串
string& operator=(char c) 字符赋值给当前的字符串
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个字符赋值给字符串

2.3 string存取字符操作

char& operator[](int n) 通过[]方式取字符
char& at(int n) 通过at方法获取字符

2.4 string拼接操作

string& operator+=(const string& str) 重载+=操作符
string& operator+=(const char* str) 重载+=操作符
string& operator+=(const char c) 重载+=操作符
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

2.5 string查找和替换

int find(const string& str, int pos = 0) const 查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const 查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const 从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const 查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const 查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const 查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const 从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const 查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str) 替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s) 替换从pos开始的n个字符为字符串s

2.6 string比较操作

compare函数在>时返回 1,<时返回 -1,==时返回 0。比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的A比小写的a小。

int compare(const string &s) const 与字符串s比较
int compare(const char *s) const 与字符串s比较

2.7 string子串

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

2.8 string插入和删除操作

string& insert(int pos, const char* s) 插入字符串
string& insert(int pos, const string& str) 插入字符串
string& insert(int pos, int n, char c) 在指定位置插入n个字符c
string& erase(int pos, int n = npos) 删除从Pos开始的n个字符

2.9 string和c-style字符串转换

string 转 char* string str = "itcast"; const char* cstr = str.c_str();
char* 转 string char* s = "itcast"; string str(s);

提示:在c++中存在一个从const char*到string的隐式类型转换,却不存在从一个string对象到C_string的自动类型转换。对于string类型的字符串,可以通过c_str()函数返回string对象对应的C_string.通常,程序员在整个程序中应坚持使用string类对象,直到必须将内容转化为char*时才将其转换为C_string.

3、代码示例

  1 #include<iostream>
  2 #include<string>
  3 
  4 using namespace std;
  5 
  6 void test01() {
  7     string str1;  //string类默认构造
  8     string str2(str1);  //string类的拷贝构造
  9     string str3 = str1; //调用的是拷贝构造函数
 10 
 11     string str4 = "abcd";
 12     string str5("abcd");
 13     string str6(10,'a');  //用10个a初始化str6
 14     cout << str4 << endl;
 15     cout << str5 << endl;
 16     cout << str6 << endl;
 17 
 18     str1.assign("abcde", 3); //将给定字符串的前3个取出赋值给str1
 19     cout << str1 << endl;
 20 
 21     string str7;
 22     str7.assign("abcdefg", 2, 3); //从第2个位置开始拿三个给str7赋值
 23     cout << str7 << endl;
 24 }
 25 
 26 void test02() {   //取字符操作
 27     string s = "hello world";
 28 
 29     for (int i=0;i<s.size();i++)
 30     {
 31         //cout << s[i] << endl;
 32         cout << s.at(i) << endl;
 33     }
 34     try   //这里是为了探讨[]和at的区别,前者直接死掉,后者系统指明位置无效
 35     {
 36         //cout << s[50] << endl;
 37         cout << s.at(50) << endl;
 38     }
 39     catch (out_of_range &e)
 40     {
 41         cout << e.what() << endl;
 42     }
 43 }
 44 
 45 void test03() {  //拼接,查找,替换
 46     string s1 = "";
 47     string s2 = "爱中国";
 48     s1 += s2;  //运算符重载
 49     cout << s1 << endl; 
 50     s1.append("山西");  //类内函数在当前字符串后加字符串
 51     cout << s1 << endl;
 52 
 53     string s3 = "abcdefg";
 54     int pos1 = s3.find("def");
 55     int pos2 = s3.rfind("def");  //两种方式均可以,只是查找方向不同而已
 56     cout << "pos1=" << pos1 << endl;
 57     cout << "pos2=" << pos2 << endl;
 58 
 59     string s4 = "hello";
 60     s4.replace(1, 2, "哪吒大战悟空");  //注意是段替换
 61     cout << s4 << endl;
 62 }
 63 
 64 void test04() {   //字符串比较
 65     string s1 = "abc";
 66     string s2 = "abcd";
 67     if (s1.compare(s2)==0)  
 68     {
 69         cout << "s1和s2相等" << endl;
 70     }
 71     else if (s1.compare(s2)==1)
 72     {
 73         cout << "s1大于s2" << endl;
 74     }
 75     else {
 76         cout << "s1小于s2" << endl;
 77     }
 78 }
 79 
 80 void test05() {    //获取字符串的字串
 81     string s1 = "abcdefg";
 82     string s2 = s1.substr(2, 4);
 83     cout << s2 << endl;
 84 
 85     //举例从邮件中获取一个用户名
 86     string email = "liming@qq.com";
 87     int pos = email.find("@");
 88     string username = email.substr(0,pos);
 89     cout << username << endl;
 90 }
 91 
 92 void test06() {    //字符串的插入、删除
 93     string s1 = "hello";
 94     s1.insert(2,"  abc  ");
 95     cout << s1 << endl;
 96 
 97     s1.erase(2,7);
 98     cout << s1<<endl;
 99 }
100 
101 //char *类型的字符串和string类型的字符串的转换
102 void func1(string s) {
103     cout << s << endl;
104 }
105 void func2(const char *s) {
106     cout << s << endl;
107 }
108 void test07() {
109     string s = "abc";
110     const char *p = s.c_str();  //注意const不能少
111     func2(p);
112 
113     const char *pp = "abcdefg";  //注意const不能少
114     string ss(pp);
115     func1(ss);
116 }
117 
118 void test08()
119 {
120     string s = "abcde";
121     char& a = s[2];
122     char& b = s[3];
123 
124     a = '1';
125     b = '2';
126 
127     cout << s << endl;
128     cout << (int*)s.c_str() << endl; //注意这里打印的是地址
129 
130     s = "ppppppppppppppppp";
131 
132     a = '1';  //此时无法修改,原因是经过了内存的重新分配
133     b = '2';  //此时a,b还指向原来的地址,所以出错
134 
135     cout << s << endl;
136     cout << (int*)s.c_str() << endl;
137 
138 }
139 
140 void test09() {   //变大写和变小写
141     string s = "abCdEfg";
142 
143     for (int i = 0; i < s.size(); i++)
144     {
145         //s[i] = toupper(s[i]);
146 
147         //全变小写
148         s[i] = tolower(s[i]);
149     }
150     cout << s << endl;
151 }
152 
153 int main() {
154     //test01();
155     //test02();
156     //test03();
157     //test04();
158     //test05();
159     //test06();
160     //test07();
161     //test08();
162     test09();
163     system("pause");
164     return 0;
165 }

原文地址:https://www.cnblogs.com/lzy820260594/p/11363002.html