string类(c++)

string类是c++默认提供的,但是了解string类的写法也是非常重要的,面试中有许多关于string类的题目,string类能够考察c++类和对象的掌握程度,一定程度上也考察了面试者的编程能力。

下面是string类的一些基本功能,由于面试的时间很短,在这极短的时间内全部实现string类的功能是不可能的,我们可以实现最基本的功能,类中的构造函数、析构函数、赋值,复制的功能。

class String
{
public:
    String()     //无参构造函数
       :_str(new char[1])    
   {
        _str[0] = ‘\0‘;
    }
    
    String(const char * str)     //构造函数
        :_str(new char[strlen(str)+1])  
    //多开辟一个字符的空间,因为strcpy函数会将‘\0‘也进行拷贝,而strlen不计算‘\0‘;
    {
        strcpy(_str, str);
    }
    
    //String(const String & s)    //拷贝构造函数
    // :_str(new char[strlen(s._str)+1])
    //{
    // strcpy(_str, s._str);
    //}
    
    //现代写法
    String(const String & s)
        :_str(NULL)
    {
        String tmp(s._str);
        swap(_str, tmp._str);
    }
    
    ~String()    //析构函数
    {
        if (_str != NULL)
        {
            delete[] _str;
            _str = NULL;
            _size = 0;
            _capaciy = 0;
        }
    }
    
 //String operator==(const String & s)   //字符串相等(先开辟空间,然后释放,防止内存泄漏)
 //{
 // if (this != &s)
 // {
 //  char * tmp = new char[strlen(s._str) + 1];
 //  strcpy(_str, s._str);
 //  delete[] _str;
 // }
 //}
 
 //现代写法
    String operator==(String s)
    {
        swap(_str, s._str);
        return *this;
    }
    
    String operator<(const String & s)   //字符串小于
    {
        char *tmp = s._str;
        while (_str != ‘\0‘ && tmp != ‘\0‘)
        {       
            if (_str == tmp)
            {
                _str++;
                tmp++;
             }
            else if (_str < tmp)
            {
                return *this;
             }
            else
            {
                return s._str;
             }
        }
     }
     
     String operator<=(const String & s)    //字符串小于等于
     {
         char *tmp = s._str;
         if (_str <= tmp)
         {
             return *this;
          }
         else
        {
            return s._str;
         }
     }
     
     String operator>(const String & s)    //字符串大于
     {
         char *tmp = s._str;
         while (_str != ‘\0‘ && tmp != ‘\0‘)
        {
            if (_str == tmp)
            {
                _str++;
                tmp++;
            }
            else if (_str > tmp)
           {
               return *this;
            }
            else
           {
               return s._str;
           }
       }
    }
    
     String operator>=(const String & s)    //字符串大于等于
    {
        char *tmp = s._str;
        if (_str >= tmp)
        { 
            return *this;
        }
        else
        {
            return s._str;
        }
    }
    
    char operator[](size_t index)
    {
        return _str[index];
     }
     
    void pushBack(char ch)    //压入栈中
    {
        _checkCapacity(_size + 2);
        _str[_size] = ch;
        _str[_size + 1] = ‘\0‘;
    }
    
    void popBack()     //出栈
    {
        assert(_str);
        _size--;
        _str[_size] = ‘\0‘;
     }
     
    void Insert(size_t pos, char ch)    //插入字符
    {
        assert(pos <= _size);
        //_checkCapacity(_size);
        size_t tmp = _size;
        while (tmp >= pos)
       {
           _str[tmp + 1] = _str[tmp];  //从后往前移动
           tmp--;
        }
        _str[pos] = ch;
        _size++;
     }
     
     void Insert(size_t pos, const char *str)   //插入字符串
     {
         assert(pos <= _size);
         size_t size = strlen(str);      //增容
         _checkCapacity(size + 1 + _size);
         size_t tmp = _size;          //移位
         while (tmp >= pos)
        {
            _str[tmp + size] = _str[tmp];
            tmp--;
         }
         for (size_t i = 0; i < size; i++)    //插入
        {
             _str[pos] = str[i];
             pos++;
         }
         _size += size;
     }
     
     int Find(char ch)    //查找字符
     {
         int pos = 1;
         while (_str != ‘\0‘)
        {
            if (*_str == ch)
            {
                return pos;
             }
            else
            {
                _str++;
            }
            pos++;
        }
        return 0;
     }
     
     size_t Find(const char *sub)   //查找子串
     {
         size_t srcIndex = 0;
         size_t subSize = strlen(sub);
         while (srcIndex <= _size - subSize)
         {
             size_t subIndex = 0;
             size_t begin = srcIndex;
             while (_str[begin] == sub[subIndex] && begin < _size && subIndex < subSize)
             {
                 begin++;
                 subIndex++;
             }
             if (subIndex == subSize)
             {
                 return srcIndex;
             }
             srcIndex++;
         }
     }
     
     String & operator+=(const String & s)   //+=
     {
         Insert(_size, s._str);
         return *this;
      }
      
     void Display()
     {
         while (_str != ‘\0‘)
        {
            cout << *_str;
            _str++;
        } 
     }
     
private:
    char *_str;
    size_t _size;
    size_t _capaciy;
    
private:
    void _checkCapacity(size_t needsize)
    {
        if (needsize + 1 >= _capaciy)
        {
            _capaciy = needsize > 2 * _capaciy ? needsize : 2 * _capaciy;
            _str = (char *)realloc(_str, _capaciy);
        }
    }
};
时间: 2024-10-30 15:13:22

string类(c++)的相关文章

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

String类实现

String类是应用框架中不可或缺的类 重载运算符实现字符串的操作 #idndef IOTECK_STRING_H_#define IOTECK_STRING_H_namespace iotek{ class String { public: String(const char*=NULL); ~String(); String(const String&); //拷贝构造函数 //String a; a=b; String& operator=(const String &);

String类

一.概述 Sting s1 = "abc";    //s1是一个类类型变量,"abc"是一个对象. String s2 = new String("abc"); //s1 . s2 的区别: 前者在内存中有一个对象,后者在内存中有两个对象. s1.equals(s2) 为true  因为 String复写了equals方法 二.常见的功能-获取和判断 获取: 1.int length(); 获取长度 2.char chatAt(int inde

C++实现String类

这是一道十分经典的面试题,可以短时间内考查学生对C++的掌握是否全面,答案要包括C++类的多数知识,保证编写的String类可以完成赋值.拷贝.定义变量等功能. #include<iostream> using namespace std; class String { public: String(const char *str=NULL); String(const String &other); ~String(void); String &operator =(cons

java中String类的构造函数

String类中的构造函数String(); 构造一个空字符串对象String(byte[] bytes); 通过byte数组构造字符串对象String(byte[] bytes,int offset,int length);通过byte数组,从offset开始,总共length长的字节构造字符串对象String(char[] value); 通过char数组构造字符串对象String(byte[] char,int offset,int length);通过char数组,从offset开始,总

Java (六、String类和StringBuffer)

Java String 类 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 创建字符串 // ==比较的是字符串在栈中存放的首地址,而equals()比较的是两个字符串的内容是否相同 //普通的声明字符串的方法,只会在字符串常量池里开辟空间,并且开辟空间之前,会检查字符串常量池里是否已存在 //相同的数据,如果有,直接指向已存在的数据,如果没有会在字符串常量池里开辟一个新的空间 String s = "ccy"

JAVA API(一)String类和StringBuffer类

1.String类和StringBuffer类 在程序中经常会用到字符串,所谓的字符串就是指一连串的字符,它是由多个单个字符连接而成的.字符串中可以包含任意字符,这些字符必须包含在一对双引号""之内,如"abc".在Java中定义了String和StringBuffer类来封装字符串,并提供了一系列操作字符串的方法,它们都位于java.lang包中,因此不需要导包就可以直接使用.下面将对String类和StringBuffer类详细讲解. 1.1String类的初始

String类replaceAll方法正则替换深入分析

作者网址: https://my.oschina.net/shipley/blog/98973 背景:      前几天有人发了一个关于下面问题的贴,对这个有点好奇,故花时间做了点研究.        对单个反斜杠字符串替换成双斜杠的Java实现如下:    String s = "\\";    方法一:String sr1 = s.replaceAll("\\\\", "\\\\\\\\");    方法二:String sr1 = s.re

java11-3 String类的获取功能

package cn_String2;/* String类的获取功能 int length():获取字符串的长度. char charAt(int index):获取指定索引位置的字符 int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引. 为什么这里是int类型,而不是char类型? 原因是:'a'和97其实都可以代表'a' int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引. int indexOf(int ch,int

C++的string类

关于头文件cstring,提供了strlen及很多与字符串相关的函数的声明. 头文件string,要使用string类,必须在程序中包含头文件string,string类位于std中,必须提供一条using编译指令,或者使用std::string来引用它. 1.string类的使用: 不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string对象. size()是string类的一个方法.可以将C++里边的string类理解成类型,我觉的可以理解成,创建:一个新类型,就像j