String

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.返回对象引用
    }
  1. 打印字符串的时候,字符串必须非空;
  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:进阶版本
  1. 空串的表示
   String():str(NULL){
        str = new char[1];
        str[0] = '\0'; //空串
    }
  1. 打印函数友元化
 friend void Print(String& s){// 友元全局函数虽然放在类里面,但是不属于类,是全局函数
        cout << s.str << endl;
    }
};
  1. 返回字符串指针
  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;
  1. 元音的情况
 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怎么用?

  1. 创建

    string a; // 创建一个空字符串
    string b("Hello World"); // 创建值为Hello World的字符串
    string c(20,'a'); // 创建一个有20个'a'的字符串
    
  2. 获取字符个数
    获取字符个数对象.size()/对象.length()
    判读是否为空对象.empty()

  3. 添加/删除
    尾添加字符对象.push_back()
    尾删除字符对象.pop_back()
    尾添加字符串对象.append()

  4. 访问字符
    获取第一个元素对象.front()
    获取最后一个元素对象.back()
    随机访问对象.[下表]或者对象.at(下标)
    获取字符数组对象.c_str()

  5. 运算符
    赋值=
    比较==
    添加+
    输入>>
    输出<<

4. 1.3 练习

  1. 从界面输入字符串并逆序打印每个字符。
  2. 交换两组字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值