小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
string 容器
本质:string 是C++风格的字符串,而string 本质上是一个类
string 与 char 的区别 :
char*是一个指针string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器
特点:
-
string类内部封装了很多成员方法如:查找find,拷贝copy,删除delete,替换replace,插入insert -
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部负责
string 构造函数
【函数原型】:
string() : 创建一个空的字符串
string(const char*s); 使用字符串s进行初始化
复习:
常量指针:const int *p : 指向可变,指针指向的内容不可变
指针常量:int *const p : 执向不变,指针指向的内容可以变
string(const string &str) ; 使用一个string对象初始化另一个string对象
string(int n, char c) ; 使用n个字符c初始化
【demo】:
#include <iostream>
#include <string>
using namespace std;
// string 构造函数
void test01()
{
// 创建空字符串,调用无参构造函数
string str1;
cout << "调用无参构造函数 : "
<< "str1 = " << str1 << endl; // 输出为空
// 把 char* 转为 string
const char *str = "hello c++";
string str2(str);
cout << "把 char* 转为 string : "
<< "str2 = " << str2 << endl;
// 调用拷贝构造函数
string str3(str2);
cout << "调用拷贝构造函数 : "
<< "str3 = " << str3 << endl;
// 使用n个字符c初始化
string str4(5, 'a');
cout << "使用n个字符c初始化 : "
<< "str4 = " << str4 << endl;
}
int main()
{
test01();
return 0;
}
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赋值给当前的字符串
【demo】:
#include <iostream>
#include <string>
using namespace std;
void test01()
{
string str1;
str1 = "hellow c++";
cout << "str1 = " << str1 << endl;
string str2;
str2 = str1;
cout << "str2 = " << str2 << endl;
string str3;
str3 = 'a';
cout << "str3 = " << str3 << endl;
string str4;
str4.assign("str.assign(hellow c++)");
cout << "str4 = " << str4 << endl;
string str5;
str5.assign("hellow c++", 5);
cout << "str5 = " << str5 << endl;
string str6;
str6.assign(str5);
cout << "str6 = " << str6 << endl;
string str7;
str7.assign(5, 'x');
cout << "str7 = " << str7 << endl;
}
int main()
{
test01();
return 0;
}
string字符串拼接
实现字符串末尾拼接字符串
【函数原型】:
string& operator+=(const char *str); 重载+=操作符
string& operator+=(const char c); 重载+=操作符
string& operator+=(const string &str); 重载+=操作符
string& append(const char *s); 把字符串s连接到当前字符串结尾
string& append(const char *s,int n); 把字符串s的前n个字符连接到当前字符串的结尾
string& append(const string &s); 同operator+=(const string &str)
string& append(const string &s,int pos ,int n); 字符串s中从pos开始的n个字符串连接到当前字符串的结尾
【demo】:
#include <iostream>
#include <string>
using namespace std;
void test01() {
string str1 = "hello";
str1+=" c++";
cout<<"str1 = "<<str1<<endl;
str1+=":";
cout<<"str1 = "<<str1<<endl;
string str2 = " this is test demo ";
str1+=str2;
cout<<"str1 = "<<endl;
string str3 = "A";
str3.append("B");
str3.append("C");
// 从下标2位置开始,截取3个字符,拼接到字符串的末尾
str3.append(str2,2,4);
cout<<"str3 = "<<str3<<endl;
}
int main()
{
test01();
return 0;
}
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) ; 使用字符串str替换从pos开始的n个字符
string &replace(int pos , int n , const char *s) ; 使用字符串s替换从pos开始的n个字符
【demo】:
#include <iostream>
#include <string>
using namespace std;
// 查找
void test01()
{
string str1 = "abcdefghijklfg";
string subStr = "fg";
int pos = str1.find(subStr);
if (pos == -1)
{
cout << "未找到" << subStr << endl;
}
else
{
cout << subStr << "第一次出现的位置为:pos = " << pos << endl;
}
pos = str1.rfind("fg");
if (pos == -1)
{
cout << "未找到" << subStr << endl;
}
else
{
cout << subStr << "最后一次出现的位置为:pos = " << pos << endl;
}
}
// 替换
void test02()
{
string str1 = "hellow world";
string replaceStr = "c++";
str1.replace(7, 5, replaceStr);
cout << str1 << "替换后为:" << str1 << endl;
}
int main()
{
test01();
test02();
return 0;
}
【小结】:
find查找是从左往右,rfind是从右往左find查找到字符串后返回查找的第一个字符位置,找不到返回-1replace在替换时,要指定从哪个位置开始,多少个字符,替换成什么样的字符串
string字符串比较
字符串比较是按照ASCII码进行对比
- = 返回 0
- > 返回 1
- < 返回 -1
【函数原型】:
int compare(const string &s) const ; 与字符串 s 进行比较
int compare(const char *s) const ; 与字符串 s 进行比较
【demo】:
#include <iostream>
#include <string>
using namespace std;
void test01()
{
/*
字符串的比较返回值有 1,0,-1
== : 返回 0
> : 返回 1
< : 返回 -1
*/
string str1 = "hellow";
string str2 = "ellow";
int ret = str1.compare(str2);
if (ret == 0)
{
cout << "str1 == str2" << endl;
}
else if (ret > 0)
{
cout << "str1 > str2" << endl;
}
else
{
cout << "str1 < str2" << endl;
}
}
int main()
{
test01();
return 0;
}
【小结】:字符串对的比较主要是判断两个字符串是否想等,判断大小,意义不大
string字符获取
【函数原型】:
char &operator[](int n) ; 通过 [] 方式获取字符
char &at(int n) ; 通过 at 方式获取字符
【demo】:
#include <iostream>
#include <string>
using namespace std;
void test01()
{
string str = "hello c++";
// 使用 [] 获取字符
cout << "使用 [] 获取字符:";
for (int i = 0; i < str.size(); i++)
{
cout << str[i] << " ";
}
cout << endl;
// 使用 at 获取字符
cout << "使用 at 获取字符:";
for (int i = 0; i < str.size(); i++)
{
cout << str.at(i) << " ";
}
cout << endl;
}
int main()
{
test01();
return 0;
}
【注】:获取字符串的大小:str.size()
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个字符
【demo】:
#include <iostream>
#include <string>
using namespace std;
// string插入与删除操作 , 下标都是从0开始的
void test01()
{
string str1 = "hellow c++";
// 从第6个位置开始,插入" 0000"
str1.insert(6, " 0000");
cout << str1 << endl;
// 从第6个位置开始,删除连续的4个字符
str1.erase(6, 4);
cout << str1 << endl;
}
int main()
{
test01();
return 0;
}
string子串
【函数原型】:
string substr(int pos = 0 , int n = npos) const ; 返回从pos开始的n和字符组成的字符串
【demo】:
#include <iostream>
#include <string>
using namespace std;
void test01()
{
string str1 = "hellow c++";
string subStr1 = str1.substr(0, 6);
cout << subStr1 << endl;
}
int main()
{
test01();
return 0;
}