中国网站建设公司有哪些,教育网站制作开发,网站怎么开发设计,wordpress 主题设置中文版文章目录前言类框架构造与析构c_str迭代器操作符重载[]#xff1a;#xff1a; !:reverse与resizereverseresizepush_back与append复用实现insert和erasec_str与流插入、流提取eraseswap(s1,s2)与s1.swap(s2)结语前言
这次我们分几个部分来实现string类…
文章目录前言类框架构造与析构c_str迭代器操作符重载[] !:reverse与resizereverseresizepush_back与append复用实现insert和erasec_str与流插入、流提取eraseswap(s1,s2)与s1.swap(s2)结语前言
这次我们分几个部分来实现string类。具体请看目录。 说明模拟实现只实现了string中最常用的功能。
类框架
首先我们要与库里的string类区分因此我们定义一个命名空间名字可以随意起这里教学因此命名为Teacher
string.h:
namespace Teacher
{class string{public://函数实现private:char* _str;int _size;int _capacity;};
}约定在我们模拟实现过程中_str存储字符串内容_size表示现在字符串的大小不包括\0_capacity表示字符串一共有多大空间不包括\0
构造与析构
空字符串可以直接用缺省值处理我们不必再写一个空参构造函数。
//函数实现
string(const char* str ) : _size(strlen(str))
{_capacity _size;_str new char[_capacity 1];strcpy(_str, str);
}~string()
{delete[] _str;_str nullptr;_capacity _size 0;
}
c_str
迭代器
用指针来模拟实现一下迭代器唯一需要注意的就是一定要写成iterator和const_iterator不然在使用范围for的时候会报错。
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;
}操作符重载
[]
char operator[](size_t pos)
{assert(pos _size);return _str[pos];
}const char operator[](size_t pos) const
{assert(pos _size);return _str[pos];
}赋值时由于我们不知道子母串大小情况所以我们把要覆盖的串直接清空再把新的内容腾上去但这又涉及一个问题如果清空后覆盖失败怎么办这样我们不仅没有拷贝成功还失去了原有的串。因此我们采用一个临时数组先将我们的内容拷贝到这个临时串上再清理原来的串。 代码如下
string operator(const string s)
{if (this ! s){_size s._size;_capacity s._capacity;char* tmp new char[_capacity 1];strcpy(tmp, s._str);delete[] _str;_str tmp;}return *this;
}!:
由于和我们实现日期类的基本思路一致我们按照原来的思路书写即可
bool operator(const string s) const
{return strcmp(_str, s._str);
}
bool operator(const string s) const
{return strcmp(_str, s._str) 0;
}
bool operator(const string s) const
{return _str s._str || _str s._str;
}
bool operator(const string s) const
{return !(_str s._str);
}
bool operator(const string s) const
{return !(_str s._str);
}
bool operator!(const string s) const
{return !(_str s._str);
}reverse与resize
reverse
当我们对string对象进行增加操作时不管是追加一个字符还是追加一个串我们都需要判断当前对象的容量还够不够如果不够我们就要按需要扩容。至于啥时候需要扩容我们在需要的函数里再判断。reverse只管扩容。
void reserve(size_t newsize)
{char* tmp new char[newsize 1];//按照我们的约定容量不包括\0因此我们在这里加上strcpy(tmp,_str);delete[] _str;_str tmp;_capacity newsize;
}
resize
没什么好说的注意缺省值是如何使用的即可
void resize(size_t n, char ch \0)
{if (n _size){// 删除数据--保留前n个_size n;_str[_size] \0;}else if (n _size){if (n _capacity){reserve(n);}size_t i _size;while (i n){_str[i] ch;i;}_size n;_str[_size] \0;}
}
push_back与append
实现了reverse函数之后我们就可以实现push_back和append函数了 push_back:
void push_back(char ch)
{if (_size 1 _capacity){reserve(_size * 2);}_str[_size] ch;_size;_str[_size] \0;
}append:
void append(const char* str)
{int len strlen(str);if (_size len _capacity){reserve(_size len);}strcpy(_str _size, str);_size len;
}
如果你对其中判断是否需要扩容感到疑惑建议你再想想我们之前对_size和_capacity的约定。
复用实现
因为我们已经写好了上面的接口直接复用即可。
string operator(const char ch)
{push_back(ch);
}
string operator(const char* str)
{append(str);
}insert和erase
insert可以在任意位置插入 在这里提供两个思路但由于一些边界问题第一个思路你要考虑判断坐标是否合法。
void insert(size_t pos, const char ch)
{//在pos处插入一个字节if (_size 1 _capacity){reserve(_capacity * 2);}size_t end _size;//无符号数会出越界的bugwhile (end pos end ! -1){_str[end 1] _str[end];end--;}_str[pos] ch;_size;
}void insert2(size_t pos, const char ch)
{//在pos处插入一个字节if (_size 1 _capacity){reserve(_capacity * 2);}size_t end _size1;while (end pos){_str[end] _str[end-1];end--;}_str[pos] ch;_size;
}
erase删除一部分数据注意这里给出了npos的缺省值我们在类成员函数处加上即可。
static const size_t npos;const size_t npos -1;上面这种给静态变量赋值的方式只能赋值成int其他类型均不可以。
void erase(size_t pos, size_t len npos)
{int begin pos len;while (begin _size){_str[begin - len] _str[begin];begin;}_size - len;
}
c_str与流插入、流提取
由于自定义的类型不能直接输出打印因此我们要拿到对象内的字符数组这样才能按照C语言的方式来打印字符串。 代码如下
const char* c_str()
{return _str;
}而流插入和流提取即重载两个操作符 为什么需要重载流插入和流提取 流提取
ostream operator(ostream out, const string s)
{//需要写迭代器for (auto ch : s){out s;}return out;
}流插入
istream operator(istream is,string s)
{char ch in.get()char buff[128];size_t i 0;while(ch ! ch ! \n){buff[i] ch;i;if(i 127){buff[127] \0;s buff;i 0;}ch in.get();}if(i ! 0){buff[i] \0;sbuff;}
}erase
erase可以分两种情况考虑即把pos后面全删了还是删除pos后有限个元素我们可以单独处理具体详见代码
void erase(size_t pos,size_t len npos)
{if (pos len _size || len npos){_str[pos] \0;_size pos;}else{strcpy(_strpos,_strposlen);_size - len;}
}
因为设计到在同一个字符串里用strcpy我们这里不用担心会覆盖的问题因为左边是我们要删除的右边的是我们的源头所以覆盖的是无用的元素。可以直接使用。
swap(s1,s2)与s1.swap(s2)
最后来谈一下交换两个对象的函数。 更推荐使用第二种
void swap(string s2)
{std::swap(_str, s2._str);std::swap(_size, s2._size);std::swap(_capacity, s2._capacity);
}如果选择第一种会怎么样其实会进行三次拷贝构造这样是非常低效的详细如图采用第二种会好很多。1
结语
到这里本篇文章就到此为止了我们下次见~ 文章转载自: http://www.morning.zkpwk.cn.gov.cn.zkpwk.cn http://www.morning.mzkn.cn.gov.cn.mzkn.cn http://www.morning.gywxq.cn.gov.cn.gywxq.cn http://www.morning.yznsx.cn.gov.cn.yznsx.cn http://www.morning.qmkyp.cn.gov.cn.qmkyp.cn http://www.morning.jstggt.cn.gov.cn.jstggt.cn http://www.morning.jwefry.cn.gov.cn.jwefry.cn http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.lysrt.cn.gov.cn.lysrt.cn http://www.morning.jzbjx.cn.gov.cn.jzbjx.cn http://www.morning.khpgd.cn.gov.cn.khpgd.cn http://www.morning.tdttz.cn.gov.cn.tdttz.cn http://www.morning.bhwz.cn.gov.cn.bhwz.cn http://www.morning.tfbpz.cn.gov.cn.tfbpz.cn http://www.morning.dfwkn.cn.gov.cn.dfwkn.cn http://www.morning.mgbcf.cn.gov.cn.mgbcf.cn http://www.morning.kaweilu.com.gov.cn.kaweilu.com http://www.morning.rrrrsr.com.gov.cn.rrrrsr.com http://www.morning.kgslc.cn.gov.cn.kgslc.cn http://www.morning.jhtrb.cn.gov.cn.jhtrb.cn http://www.morning.chfxz.cn.gov.cn.chfxz.cn http://www.morning.sjsks.cn.gov.cn.sjsks.cn http://www.morning.rrxnz.cn.gov.cn.rrxnz.cn http://www.morning.xfncq.cn.gov.cn.xfncq.cn http://www.morning.hncrc.cn.gov.cn.hncrc.cn http://www.morning.zfcfx.cn.gov.cn.zfcfx.cn http://www.morning.pmlgr.cn.gov.cn.pmlgr.cn http://www.morning.brxzt.cn.gov.cn.brxzt.cn http://www.morning.pnntx.cn.gov.cn.pnntx.cn http://www.morning.fpngg.cn.gov.cn.fpngg.cn http://www.morning.hpprx.cn.gov.cn.hpprx.cn http://www.morning.xjqrn.cn.gov.cn.xjqrn.cn http://www.morning.tnbsh.cn.gov.cn.tnbsh.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn http://www.morning.jfzbk.cn.gov.cn.jfzbk.cn http://www.morning.ryjqh.cn.gov.cn.ryjqh.cn http://www.morning.bbjw.cn.gov.cn.bbjw.cn http://www.morning.bpmfn.cn.gov.cn.bpmfn.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn http://www.morning.lffrh.cn.gov.cn.lffrh.cn http://www.morning.hxcuvg.cn.gov.cn.hxcuvg.cn http://www.morning.hlppp.cn.gov.cn.hlppp.cn http://www.morning.wbqt.cn.gov.cn.wbqt.cn http://www.morning.pqxjq.cn.gov.cn.pqxjq.cn http://www.morning.hqwcd.cn.gov.cn.hqwcd.cn http://www.morning.bwygy.cn.gov.cn.bwygy.cn http://www.morning.dktyc.cn.gov.cn.dktyc.cn http://www.morning.bxqry.cn.gov.cn.bxqry.cn http://www.morning.rhjsx.cn.gov.cn.rhjsx.cn http://www.morning.jzlfq.cn.gov.cn.jzlfq.cn http://www.morning.lgxzj.cn.gov.cn.lgxzj.cn http://www.morning.fqtzn.cn.gov.cn.fqtzn.cn http://www.morning.qnhpq.cn.gov.cn.qnhpq.cn http://www.morning.tgnr.cn.gov.cn.tgnr.cn http://www.morning.klpwl.cn.gov.cn.klpwl.cn http://www.morning.kdfqx.cn.gov.cn.kdfqx.cn http://www.morning.ktbjk.cn.gov.cn.ktbjk.cn http://www.morning.llllcc.com.gov.cn.llllcc.com http://www.morning.nqbcj.cn.gov.cn.nqbcj.cn http://www.morning.jpjxb.cn.gov.cn.jpjxb.cn http://www.morning.znsyn.cn.gov.cn.znsyn.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.lbgsh.cn.gov.cn.lbgsh.cn http://www.morning.qxlgt.cn.gov.cn.qxlgt.cn http://www.morning.lqchz.cn.gov.cn.lqchz.cn http://www.morning.tkqzr.cn.gov.cn.tkqzr.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.youyouling.cn.gov.cn.youyouling.cn http://www.morning.nqbkb.cn.gov.cn.nqbkb.cn http://www.morning.mntxalcb.com.gov.cn.mntxalcb.com http://www.morning.nnttr.cn.gov.cn.nnttr.cn http://www.morning.lhrwy.cn.gov.cn.lhrwy.cn http://www.morning.chmkt.cn.gov.cn.chmkt.cn http://www.morning.ctwwq.cn.gov.cn.ctwwq.cn http://www.morning.dtrcl.cn.gov.cn.dtrcl.cn http://www.morning.cywf.cn.gov.cn.cywf.cn http://www.morning.lrplh.cn.gov.cn.lrplh.cn http://www.morning.wdskl.cn.gov.cn.wdskl.cn