String类增删改查的实现
来源:互联网 发布:网络接入服务商怎么查 编辑:程序博客网 时间:2024/04/18 18:54
实现String类的增删改查,代码如下:
//Stringclass.h#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include<string>#include<iostream>#include"assert.h"using namespace std;class Stringclass{public: Stringclass(char* str = " ") :_str(new char[strlen(str) + 1]), _size(strlen(str)), _capacity(strlen(str)) { strcpy(_str, str); } Stringclass(const Stringclass& s) :_str(new char[strlen(s._str) + 1])//拷贝构造,这里使用传统的深拷贝方法,自己开辟空间,自己拷贝 { strcpy(_str, s._str); _size = strlen(s._str); _capacity = strlen(s._str); } Stringclass& operator=(Stringclass s)//赋值运算符重载,这里传参调用了拷贝构造 { Swap(s); return *this; } void Swap(Stringclass& s) { swap(_str, s._str); _size = s._size; _capacity = s._capacity; } ~Stringclass()//析构函数 { if (_str) { delete[] _str; _str = NULL; } _size = 0; _capacity = 0; } char*GetStr() { return _str; } size_t Size() { return _size; } size_t Capacity() { return _capacity; } // 增删查改 void PushBack(char ch) { if (_size == _capacity) { Expand(2 * _capacity + 1); } _str[_size] = ch; ++_size; _str[_size] = '\0'; } void PushBack(const char* str) { size_t len = strlen(str); if ((_size + len) > _capacity) { Expand(_size + len + 1); } for (size_t i = 0; i < len; ++i) { _str[i + _size] = str[i]; } _size = _size + len; _str[_size] = '\0'; _capacity = _size + len; } void PopBack() { if (_size == 0) { printf("It is empty!"); return; } else { _str[_size - 1] = '\0'; --_size; } } void Expand(size_t n) { char* tmp = new char[n]; strcpy(tmp, _str); _str = tmp; _capacity = n - 1; } void Insert(size_t pos, char ch) { if (_size == _capacity) { Expand(2 * _capacity + 1); } size_t end = _size; assert(pos < end); while (pos < end) { _str[end] = _str[end - 1]; end--; } _str[pos] = ch; ++_size; _str[_size] = '\0'; } void Insert(size_t pos, const char* str) { size_t len = strlen(str); if ((_size + len) > _capacity) { Expand(_size + len + 1); } size_t end = _size; assert(pos < end); while ((int)pos < end) { _str[end + len] = _str[end]; end--; } while (len--) { _str[pos] = *str++; } _size = _size + len; _str[_size] = '\0'; } /*void Erase(size_t pos, size_t count) { assert(pos + count<_size); size_t index = pos + count; while (*(_str + index) != '\0') { _str[index - count] = _str[index]; index++; } _size = _size - count; _str[_size] = '\0'; }*/ void Erase(size_t pos, size_t count) { assert(pos<_size); if (pos + count > _size) { _str[pos] = '\0'; _size = pos; } else { for (size_t i = pos + count; i <= _size; i++) { _str[pos++] = _str[i]; } _size -= count; } } size_t Find(char ch) const { for (size_t i = 0; i < _size; i++) { if (_str[i] == ch) { return i; } } return NULL; } size_t Find(const char* str) //查找字符串中str字符串第一次出现的位置 { const char* sub = str; const char* src = _str; for (size_t i = 0; i < _size; i++) { src = _str + i; const char* sub_ = sub; const char* src_ = src; while (*sub_&&*sub_ == *src_) { sub_++; src_++; } if (*sub_ == '\0') { return i; } } /*const char* sub = str; const char* src = _str; while (*src) { const char* sub_ = sub; const char* src_ = src; while (*sub_&&*sub_ == *src_) { sub_++; src_++; } if (*sub_ == '\0') { return (src - _str); } src++; }*/ return -1; } char& operator[](size_t pos) { assert(pos <= strlen(_str)); return _str[pos]; } bool operator<(const Stringclass& s) const { // hello < hello // hello1 < hello // hello < hello2 char* str1 = _str; char* str2 = s._str; while (*str1&&*str2) { if (*str1 < *str2) { return true; } else if (*str1>*str2) { return false; } else { str1++; str2++; } } if (*str1 == '\0'&&*str2!='\0') { return true; } else { return false; } } bool operator<=(const Stringclass& s) const { char* str1 = _str; char* str2 = s._str; while (*str1&&*str2) { if (*str1 < *str2) { return true; } else if (*str1>*str2) { return false; } else { str1++; str2++; } } if (*str1 == '\0') { return true; } else { return false; } } bool operator>(const Stringclass& s) const { bool ret = this->operator<=(s); return (!(ret)); } bool operator>=(const Stringclass& s) const { return !(this->operator<(s)); } bool operator==(const Stringclass& s) const { char* str1 = _str; char* str2 = s._str; while(*str1 && *str2) { if (*str1 == *str2) { str1++; str2++; } else { return false; } } if (*str1 == '\0'&&*str2 == '\0') { return true; } else { return false; } } bool operator!=(const Stringclass& s)const { return !(this->operator == (s)); }private: char* _str; size_t _size;//字符个数 size_t _capacity;//容量空间};
//test.cpp#include"Stringclass.h"void Test(){ Stringclass s1; cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl; Stringclass s2("abcdefgh"); cout << s2.GetStr() << ":" << s2.Size() << ":" << s2.Capacity() << endl; Stringclass s3; s3 = s2; cout << s3.GetStr() << ":" << s3.Size() << ":" << s3.Capacity() << endl; s2.PushBack('a'); s2.PushBack('b'); s2.PushBack('c'); s2.PushBack('d'); cout << s2.GetStr() << ":" << s2.Size() << ":" << s2.Capacity() << endl; char* s = "abcd"; s3.PushBack(s); cout << s3.GetStr() << ":" << s3.Size() << ":" << s3.Capacity() << endl; s2.PopBack(); s2.PopBack(); s2.PopBack(); s2.PopBack(); cout << s2.GetStr() << ":" << s2.Size() << ":" << s2.Capacity() << endl;}void Test2(){ Stringclass s1("ababab"); Stringclass s2("efghijklmn"); Stringclass s3("ababab"); Stringclass s4("ababa"); Stringclass s5("abababb"); cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl; s1.Insert(3, 'c'); cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl; s1.Erase(3, 2); cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl; cout << s2.GetStr() << ":" << s2.Size() << ":" << s2.Capacity() << endl; cout << s2.Find('i')<<endl; char* str1 = "gh"; char* str2 = "kl"; cout << s2.Find(str1) << endl; cout << s2.Find(str2) << endl; s1 = s3; cout << s1.GetStr() << ":" << s1.Size() << ":" << s1.Capacity() << endl; cout << (s1 == s2) << endl; cout << (s1 != s2) << endl; cout << (s1 < s3) << endl; cout << (s1 < s4) << endl; cout << (s1 < s5) << endl; cout << (s1 <= s3) << endl; cout << (s1 <= s4) << endl; cout << (s1 <= s5) << endl; cout << (s1 > s3) << endl; cout << (s1 > s4) << endl; cout << (s1 > s5) << endl; cout << (s1 >= s3) << endl; cout << (s1 >= s4) << endl; cout << (s1 >= s5) << endl;}int main(){ //Test(); Test2(); system("pause"); return 0;}
运行test()测试结果如下:
运行test2()测试结果如下:
阅读全文
0 0
- String类增删改查的实现
- String的增删查改的实现
- 模拟实现string的增删查改
- 模拟实现String类增删查改
- 模拟实现string类的增删查改
- String类的增删查改
- string的增删改查
- string的增删查改
- 【c++】模拟实现string类__实现增删查改
- 模拟实现string类,以及增删查改各种功能
- String类深拷贝写法的增删查改
- C++ string字符串的增删改查
- C++ String的增删查改
- 模拟String的增删查改
- C++ 模拟String类增删查改
- C++ string类增删查改
- String—增删查改
- SqlHelper类实现增删改查的封装
- spring_springMvc-mybatis 整合教程
- html textarea标签的innerHTML属性和value属性的区别
- 爬取并打印《ES6标准入门》PDF--Puppeteer初探
- Struts2_002_Strtus2概述
- NYOJ 42 一笔画问题 (欧拉回路+并查集)
- String类增删改查的实现
- 浅谈http的基本概述
- 003_Hello Struts(Struts2环境搭建)
- Spark实现WordCount单词计数
- 【C++】KMP浅析及其代码
- String 深拷贝
- Python之csv文件从MySQL数据库导入导出
- 精神病不是好笑的电视广告视频,那些人被卫星攻击。拒绝精神病广告
- 求二叉树的高度(深度+1)