程序分享:c++实现string类

来源:互联网 发布:unity3d无缝地图 编辑:程序博客网 时间:2024/06/08 10:19

今天来分享一个string类的实现代码

String.h

#pragma once#include<iostream>using namespace std;class String{public:String(char* str = "");String(const String& s);String& operator=(String s);void Swap(String& s);~String();char* GetStr();size_t Size();size_t Capacity();void Show();// 增删查改 void String::CheckCapacity(size_t num);void PushBack(char ch);void PushBack(const char* str);void PopBack();void Insert(size_t pos, char ch);void Insert(size_t pos, const char* str);void Erase(size_t pos, size_t count);size_t Find(char ch) const;size_t Find(const char* str) const;char& operator[](size_t pos);bool operator<(const String& s) const;bool operator<=(const String& s) const;bool operator>(const String& s) const;bool operator>=(const String& s) const;bool operator==(const String& s) const;bool operator!=(const String& s)const;void Expand(size_t n);private:char* _str;size_t _size; // 字符个数 size_t _capacity; // 容量空间 };

String.c

#include"String.h"String::String(char* str): _size(strlen(str)), _capacity(strlen(str) + 1), _str(new char[strlen(str) + 1]){strcpy(_str, str);}String::String(const String& s)//现代写法: _capacity(s._capacity), _size(s._size), _str(NULL){String tmp(s._str);swap(_str, tmp._str);}String& String::operator=(String s){if (_str != s._str){String tmp(s._str);_size = tmp._size;_capacity = tmp._capacity;swap(_str, tmp._str);}return *this;}String::~String(){if (_str != NULL){delete[] _str;_str = NULL;_size = 0;_capacity = 0;}}void String::Show(){size_t i = 0;while (i < _size){cout << *(_str + i);i++;}cout << endl;}void String::Swap(String& s){swap(_str, s._str);swap(_size, s._size);swap(_capacity, s._capacity);}char* String::GetStr(){return _str;}size_t String::Size(){return _size;}size_t String::Capacity(){return _capacity;}void String::CheckCapacity(size_t num){if (_size + num >= _capacity){Expand(num);}}void String::Expand(size_t n){size_t newCapacity = (_capacity * 2 > _capacity + n) ? (_capacity * 2) : (_capacity + n);char* tmp = new char[newCapacity];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = newCapacity;}void String::PushBack(char ch){CheckCapacity(1);*(_str + _size++) = ch;*(_str + _size) = '\0';}void String::PushBack(const char* str){size_t len = strlen(str);size_t i = 0;CheckCapacity(len);for (; i < len; i++){*(_str + _size + i) = *(str + i);}*(_str + _size + i) = '\0';_size += len;}void String::PopBack(){*(_str + --_size) = '\0';}void String::Insert(size_t pos, char ch){if(pos <= _size){int i;CheckCapacity(1);for (i = _size; i >= (int)pos; i--){*(_str + i) = *(_str + i - 1);}*(_str + pos) = ch;*(_str + ++_size) = '\0';}else{cout << "The position is wrong!" << endl;}}void String::Insert(size_t pos, const char* str){if (pos <= _size){size_t len = strlen(str);int i;CheckCapacity(len);for (i = _size; i >= (int)pos; i--){*(_str + len + i - 1) = *(_str + i - 1);}for (i = 0; i < len; i++){*(_str + pos + i) = *(str + i);}_size += len;*(_str + _size) = '\0';}else{cout << "The position is wrong!" << endl;}}void String::Erase(size_t pos, size_t count){if (pos <= _size){if (pos + count <= _size){_size -= count;for (int i = pos; i <= _size; i++){*(_str + i) = *(_str + count + i);}}else{cout << "The count is wrong!" << endl;}}else{cout << "The position is wrong!" << endl;}}size_t String::Find(char ch) const{size_t i;for (i = 0; i < _size; i++){if (*(_str + i) == ch){return i;}}return -1;}size_t String::Find(const char* str) const{size_t i = 0;for (; i < _size; i++){size_t j = 0;while (*(_str + i + j) == *(str + j) && *(str + j) != '\0'){j++;}if (*(str + j) == '\0'){return i;}}return -1;}char& String::operator[](size_t pos){if (pos <= _size){return *(_str + pos);}else{cout << "The position is wrong!" << endl;}}bool String::operator<(const String& s) const{size_t i = 0;while (*(_str + i) != '\0' && *(s._str + i) != '\0'){if (*(_str + i) < *(s._str + i)){return true;}else if (*(_str + i) == *(s._str + i)){i++;}else{return false;}}if (*(_str + i) < *(s._str + i)){return true;}else{return false;}}bool String::operator<=(const String& s) const{size_t i = 0;while (*(_str + i) != '\0' && *(s._str + i) != '\0'){if (*(_str + i) < *(s._str + i)){return true;}else if (*(_str + i) == *(s._str + i)){i++;}else{return false;}}if (*(_str + i) <= *(s._str + i)){return true;}else{return false;}}bool String::operator>(const String& s) const{size_t i = 0;while (*(_str + i) != '\0' && *(s._str + i) != '\0'){if (*(_str + i) > *(s._str + i)){return true;}else if (*(_str + i) == *(s._str + i)){i++;}else{return false;}}if (*(_str + i) > *(s._str + i)){return true;}else{return false;}}bool String::operator>=(const String& s) const{size_t i = 0;while (*(_str + i) != '\0' && *(s._str + i) != '\0'){if (*(_str + i) > *(s._str + i)){return true;}else if (*(_str + i) == *(s._str + i)){i++;}else{return false;}}if (*(_str + i) >= *(s._str + i)){return true;}else{return false;}}bool String::operator==(const String& s) const{size_t i = 0;while (*(_str + i) != '\0' && *(s._str + i) != '\0'){if (*(_str + i) == *(s._str + i)){i++;}else{return false;}}if (*(_str + i) == *(s._str + i)){return true;}else{return false;}}bool String::operator!=(const String& s) const{size_t i = 0;while (*(_str + i) != '\0' && *(s._str + i) != '\0'){if (*(_str + i) == *(s._str + i)){i++;}else{return true;}}if (*(_str + i) != *(s._str + i)){return true;}else{return false;}}
原创粉丝点击