wordpress编辑器位置,百度seo公司哪家最好,南宁seo企业优化,网站空间费string的模拟实现 文章目录string的模拟实现一、浅拷贝和深拷贝1.浅拷贝2.深拷贝3.写时拷贝二、定义string的成员变量三、string的接口实现1.string的默认成员函数#xff08;1#xff09;构造函数实现#xff08;2#xff09;析构函数实现#xff08;3#xff09;拷贝构…string的模拟实现 文章目录string的模拟实现一、浅拷贝和深拷贝1.浅拷贝2.深拷贝3.写时拷贝二、定义string的成员变量三、string的接口实现1.string的默认成员函数1构造函数实现2析构函数实现3拷贝构造函数4赋值运算符重载2.string的迭代器实现3.string的容量操作函数4.string的访问操作函数5.string的修改操作函数6.string的查找函数7.string的c_str和substr8.string的 !9.string的operator四、源代码总结1.String.h2.String.cpp一、浅拷贝和深拷贝 1.浅拷贝 2.深拷贝
如果一个类中涉及到资源的管理其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出 一般情况都是按照 深拷贝 提供 3.写时拷贝 二、定义string的成员变量 三、string的接口实现
1.string的默认成员函数
1构造函数实现
这种短小频繁调用的函数可以直接定义到类里面默认是 inline 2析构函数实现
这里要注意一下判断 str是否为空 3拷贝构造函数 4赋值运算符重载 2.string的迭代器实现
string中迭代器iterator就是一个指针。所以我们直接使用typedef实现 begin和end 本质上都是 指针 3.string的容量操作函数
size、capacity、clear、empty都很简单一看就懂 接下来是reserve()只要新容量大于旧容量就发生扩容。 4.string的访问操作函数
这部分较为简单其实就是 数组的下表访问[ ] 和 front()与back() 5.string的修改操作函数
两个常用的修改函数 push_back()与append() 就是在push_back和append的应用 insert有两种类型第一种类似于头插第二种类似于任意位置插入 二者都需要挪动数据和检验数组的扩容问题 pop_back函数较为简单 字符串的删除函数erase函数类似于尾删也可以任意位置删除 将pos位置后所有字符往前移动len个单位如果为字符len1否则len字符串长度 6.string的查找函数
find函数既可以查找字符也可以查找字符串用strstr函数 7.string的c_str和substr 8.string的 ! 9.string的operator
注意普通istream对象无法提前空格与\n。这是我们就需要一个函数get()来提取 四、源代码总结
1.String.h 代码如下示例 #define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#includeiostream
#includestring
#includeassert.h
using namespace std;
namespace bit
{class string{public:typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str _size;}/*string():_str(new char[1]{\0}),_size(0),_capacity(0){}*/// 短小频繁调用的函数可以直接定义到类里面默认是inlinestring(const char* str ){_size strlen(str);// _capacity不包含\0_capacity _size;_str new char[_capacity 1];strcpy(_str, str);}// 深拷贝问题// s2(s1)/*string(const string s){_str new char[s._capacity 1];strcpy(_str, s._str);_size s._size;_capacity s._capacity;}*/void swap(string s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}// s2(s1)// 现代写法string(const string s){string tmp(s._str);swap(tmp);}// s2 s1// s1 s1/*string operator(const string s){if (this ! s){delete[] _str;_str new char[s._capacity 1];strcpy(_str, s._str);_size s._size;_capacity s._capacity;}return *this;}*/// s1 s3;//string operator(const string s)//{// if (this ! s)// {// //string tmp(s._str);// string tmp(s);// swap(tmp);// }// return *this;//}// s1 s3;string operator(string tmp){swap(tmp);return *this;}~string(){if (_str){delete[] _str;_str nullptr;_size _capacity 0;}}const char* c_str() const{return _str;}void clear(){_str[0] \0;_size 0;}bool empty() const{return _size 0;}size_t size() const{return _size;}size_t capacity() const{return _capacity;}// 可读可写char front(){return _str[0];}char back(){return _str[_size - 1];}// 可读不可写const char front()const{return _str[0];}const char back()const{return _str[_size - 1];}char operator[](size_t pos){assert(pos _size);return _str[pos];}const char operator[](size_t pos) const{assert(pos _size);return _str[pos];}/*void copy_on_write(){if (count 1){深拷贝}}*/void reserve(size_t n);void push_back(char ch);void append(const char* str);string operator(char ch);string operator(const char* str);void insert(size_t pos, char ch);void insert(size_t pos, const char* str);void erase(size_t pos, size_t len npos);size_t find(char ch, size_t pos 0);size_t find(const char* str, size_t pos 0);string substr(size_t pos 0, size_t len npos);private://char _buff[16];char* _str nullptr;size_t _size 0;size_t _capacity 0;//static const size_t npos -1;static const size_t npos;/*static const int N 10;int buff[N];*/};bool operator(const string s1, const string s2);bool operator(const string s1, const string s2);bool operator(const string s1, const string s2);bool operator(const string s1, const string s2);bool operator(const string s1, const string s2);bool operator!(const string s1, const string s2);ostream operator(ostream out, const string s);istream operator(istream in, string s);
} 2.String.cpp 代码如下示例 #includestring.hnamespace bit
{const size_t string::npos -1;void string::reserve(size_t n){if (n _capacity){//cout reserve: n endl;char* tmp new char[n 1];strcpy(tmp, _str);delete[] _str;_str tmp;_capacity n;}}void string::push_back(char ch){if (_size _capacity){reserve(_capacity 0 ? 4 : _capacity * 2);}_str[_size] ch;_size;_str[_size] \0;}string string::operator(char ch){push_back(ch);return *this;}void string::append(const char* str){size_t len strlen(str);if (_size len _capacity){// 大于2倍需要多少开多少小于2倍按2倍扩reserve(_size len 2 * _capacity ? _size len : 2 * _capacity);}strcpy(_str _size, str);_size len;}string string::operator(const char* str){append(str);return *this;}void string::insert(size_t pos, char ch){assert(pos _size);if (_size _capacity){reserve(_capacity 0 ? 4 : _capacity * 2);}// 挪动数据size_t end _size 1;while (end pos){_str[end] _str[end - 1];--end;}_str[pos] ch;_size;}void string::insert(size_t pos, const char* s){assert(pos _size);size_t len strlen(s);if (_size len _capacity){// 大于2倍需要多少开多少小于2倍按2倍扩reserve(_size len 2 * _capacity ? _size len : 2 * _capacity);}size_t end _size len;while (end pos len - 1){_str[end] _str[end - len];--end;}for (size_t i 0; i len; i){_str[pos i] s[i];}_size len;}void string::erase(size_t pos, size_t len){assert(pos _size);if (len _size - pos){_str[pos] \0;_size pos;}else{for (size_t i pos len; i _size; i){_str[i - len] _str[i];}_size - len;}}size_t string::find(char ch, size_t pos){assert(pos _size);for (size_t i pos; i _size; i){if (_str[i] ch){return i;}}return npos;}size_t string::find(const char* str, size_t pos){assert(pos _size);const char* ptr strstr(_str pos, str);if (ptr nullptr){return npos;}else{return ptr - _str;}}string string::substr(size_t pos, size_t len){assert(pos _size);// len大于剩余字符长度更新一下lenif (len _size - pos){len _size - pos;}string sub;sub.reserve(len);for (size_t i 0; i len; i){sub _str[pos i];}return sub;}bool operator(const string s1, const string s2){return strcmp(s1.c_str(), s2.c_str()) 0;}bool operator(const string s1, const string s2){return s1 s2 || s1 s2;}bool operator(const string s1, const string s2){return !(s1 s2);}bool operator(const string s1, const string s2){return !(s1 s2);}bool operator(const string s1, const string s2){return strcmp(s1.c_str(), s2.c_str()) 0;}bool operator!(const string s1, const string s2){return !(s1 s2);}ostream operator(ostream out, const string s){for (auto ch : s){out ch;}return out;}// 1716继续istream operator(istream in, string s){s.clear();const int N 256;char buff[N];int i 0;char ch;//in ch;ch in.get();while (ch ! ch ! \n){buff[i] ch;if (i N - 1){buff[i] \0;s buff;i 0;}//in ch;ch in.get();}if (i 0){buff[i] \0;s buff;}return in;}
}