文章目录
1.String的简单应用
(1)两种初始化方式
string s1("Hello"); //(1.1)初始化方式1;
string s2 = "World"; //(1.2)初始化方式2;
(2)size()用来表示大小,即包含的字符的个数;
cout << s2.size() << ":" << s2 << endl;
(3)"+"用来连接字符串
string s3 = s1+" "+s2;
(4)尾插法;
s3.push_back('!');//(4)尾插法;
(5)头插法;
s3.append("你好世界!");//(5)头插法;
(6)遍历
for(int i=0;i<s3.size();++i){ //(6)遍历
cout << s3[i] << " ";
}
(7)string转化为字符
const char* str = s3.c_str(); //(7)string转化为字符
(完整代码见001_string.cpp)
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cout << s.size() << endl;
string s1("Hello");//(1.1)初始化方式1;
cout << s1.size() << ":" << s1 << endl;
string s2 = "World";//(1.2)初始化方式2;
cout << s2.size() << ":" << s2 << endl;//(2)size()用来表示大小,即包含的字符的个数;
//int n=10;
//int m(10);
string s3 = s1+" "+s2; //(3)"+"用来连接字符串
cout << s3.size() << ":" << s3 << endl;
s3.push_back('!');//(4)尾插法;
cout << s3 << endl;
s3.append("你好世界!");//(5)头插法;
cout <<s3.size() << ":" << s3 << endl;
for(int i=0;i<s3.size();++i){ //(6)遍历
cout << s3[i] << " ";
}
cout << endl;
const char* str = s3.c_str(); //(7)string转化为字符
cout << str << endl;
}
2.String的实现
- 方案1:初级版本
1 构造字符串;注意末尾的空;
String(const char* s){
str = new char[strlen(s)+1];
strcpy(str,s);
}
//2.拷贝构造函数,对象进行值传递,拷贝对象内容到str;
//2.1 s,str为空的话,则为空;
//2.2 非空,进行拷贝;
String(const String& s){
if(NULL==s.str) {
str = NULL;
}else{
str = new char[strlen(s.str)+1];
strcpy(str,s.str);
}
}
//3.赋值运算符重载
3.1.判断是否是自身赋值
3.2.删除原来申请的内存
3.3 重新分配内存并赋值
3.4.返回对象引用
String& operator=(String& s){
if(&s == this) return *this; // 3.1.判断是否是自身赋值
if(NULL !=str){ // 3.2.删除原来申请的内存
delete [] str;
}
if(NULL == s.str){
str = NULL;
}else{
str = new char[strlen(s.str)+1]; // 3.3 重新分配内存并赋值
strcpy(str,s.str);
}
return *this; //3.4.返回对象引用
}
- 打印字符串的时候,字符串必须非空;
void Print(){
if(NULL!=str) cout << str << endl;
}
};
(完整代码见00201_string.cpp)
#include <iostream>
#include <cstring>
using namespace std;
class String{
private:
char* str;
public:
String():str(NULL){}
//1 构造字符串;注意末尾的空;
String(const char* s){
str = new char[strlen(s)+1];
strcpy(str,s);
}
//2.拷贝构造函数,对象进行值传递,拷贝对象内容到str;
//2.1 s,str为空的话,则为空;
//2.2 非空,进行拷贝;
String(const String& s){
if(NULL==s.str) {
str = NULL;
}else{
str = new char[strlen(s.str)+1];
strcpy(str,s.str);
}
}
//3.赋值运算符重载,自己给自己复制;
String& operator=(String& s){
if(&s == this) return *this; // 3.1.判断是否是自身赋值
if(NULL !=str){ // 3.2.删除原来申请的内存
delete [] str;
}
if(NULL == s.str){
str = NULL;
}else{
str = new char[strlen(s.str)+1]; // 3.3 重新分配内存并赋值
strcpy(str,s.str);
}
return *this; //3.4.返回对象引用
}
~String(){
cout << "delete " << (void*)str << endl;
if(NULL!=str) delete [] str;
str = NULL;
}
//4. 打印字符串的时候,字符串必须非空;
void Print(){
if(NULL!=str) cout << str << endl;
}
};
int main(){
String str1;
str1.Print();
String str2("Hello");
str2.Print();
String str3(str2); // 拷贝构造函数
str3.Print();
str1 = str2; // 赋值运算符重载函数
str1.Print();
str2 = str2;// 自我赋值特例
str2.Print();
}
- 方案2:进阶版本
- 空串的表示
String():str(NULL){
str = new char[1];
str[0] = '\0'; //空串
}
- 打印函数友元化
friend void Print(String& s){// 友元全局函数虽然放在类里面,但是不属于类,是全局函数
cout << s.str << endl;
}
};
- 返回字符串指针
const char* c_str()const{
return str;
}
(完整代码见00202_string.cpp)
#include <iostream>
#include <cstring>
using namespace std;
class String{
private:
char* str;
public:
String():str(NULL){
str = new char[1];
str[0] = '\0'; //空串
}
String(const char* s){
str = new char[strlen(s)+1];
strcpy(str,s);
}
String(const String& s){
str = new char[strlen(s.str)+1];
strcpy(str,s.str);
}
String& operator=(String& s){
if(&s == this) return *this; // 1.判断是否是自身赋值
// 2.删除原来申请的内存
delete [] str;
str = new char[strlen(s.str)+1]; // 3. 重新分配内存并赋值
strcpy(str,s.str);
return *this; //4.返回对象引用
}
~String(){
cout << "delete " << (void*)str << endl;
delete [] str;
str = NULL;
}
const char* c_str()const{
return str;
}
friend void Print(String& s){// 友元全局函数虽然放在类里面,但是不属于类,是全局函数
cout << s.str << endl;
}
};
int main(){
String str1;
Print(str1);
String str2("Hello");
Print(str2);
String str3(str2); // 拷贝构造函数
Print(str3);
str1 = str2; // 赋值运算符重载函数
Print(str1);
str2 = str2;// 自我赋值特例
Print(str3);
const char* s = str2.c_str();
}
3.String的面试题
3.1转化为小写字母
https://leetcode-cn.com/problems/to-lower-case/
(1)isupper():用来判断大小写
(2)tolower():转化为小写;
(3) toupper():转化为大写;
(完整代码见003_string.cpp)
class Solution {
public:
string toLowerCase(string str) {
string res;
for(int i =0;i<str.size();++i){
res.push_back(isupper(str[i])?tolower(str[i]):str[i]);
}
return res;
}
};
3.2 反转字符串中的元音字母
https://leetcode-cn.com/problems/reverse-vowels-of-a-string/
方案一:首尾指针;
1.1 首尾指针
int p =0;
int q = s.size() - 1;
2.1 辅音的情况一
while(p<q && !isVowels(s[p])) ++p;
if(p>=q) break;
2.2 辅音的情况二
while(p<q && !isVowels(s[q])) --p;
if(p>=q) break;
- 元音的情况
char t = s[p];
s[p] = s[q];
s[q] = t;
++p;
--q;
(完整代码见00401_string.cpp)
(代码超时)
class Solution {
public:
bool isVowels(char c){
return 'a' == c || 'e' == c || 'i' == c || 'o' == c || 'u' == c
||'A' == c || 'E' == c || 'I' == c || 'O' == c || 'U' == c ;
}
string reverseVowels(string s) {
//1. 首尾指针
int p =0;
int q = s.size() - 1;
while(p<q){
//2.1 辅音的情况一
while(p<q && !isVowels(s[p])) ++p;
if(p>=q) break;
//2.2 辅音的情况二
while(p<q && !isVowels(s[q])) --p;
if(p>=q) break;
//3. 元音的情况
char t = s[p];
s[p] = s[q];
s[q] = t;
++p;
--q;
}
return s;
}
};
方案二:首尾指针(std函数);
1元音表
string tool="aoeiuAOEIU"; //1.元音表
2 辅音的情况
while(tool.find(s[i])==-1&&i<j)
++i; //2.1 辅音情况1
while(tool.find(s[j])==-1&&i<j)
--j; //2.2 辅音情况2
3.元音的情况
if(i<j) //3.元音的情况
swap(s[i++],s[j--]);
}
(完整代码见00402_string.cpp)
class Solution {
public:
string reverseVowels(string s) {
int i=0,j=s.size()-1;
string tool="aoeiuAOEIU"; //1.元音表
while(i<j)
{
while(tool.find(s[i])==-1&&i<j)
++i; //2.1 辅音情况1
while(tool.find(s[j])==-1&&i<j)
--j; //2.2 辅音情况2
if(i<j) //3.元音的情况
swap(s[i++],s[j--]);
}
return s;
}
};
4 string常见面试
4.1. string
4.1.1 string是什么?
字符串(string)是一个能够方便操作的动态字符数组。
4.1.2 string怎么用?
-
创建
string a; // 创建一个空字符串 string b("Hello World"); // 创建值为Hello World的字符串 string c(20,'a'); // 创建一个有20个'a'的字符串
-
获取字符个数
获取字符个数对象.size()
/对象.length()
判读是否为空对象.empty()
-
添加/删除
尾添加字符对象.push_back()
尾删除字符对象.pop_back()
尾添加字符串对象.append()
-
访问字符
获取第一个元素对象.front()
获取最后一个元素对象.back()
随机访问对象.[下表]
或者对象.at(下标)
获取字符数组对象.c_str()
-
运算符
赋值=
比较==
添加+
输入>>
输出<<
4. 1.3 练习
- 从界面输入字符串并逆序打印每个字符。
- 交换两组字符串。