门户网站推荐,香河住房和建设局网站,wordpress网站被自动跳转,python做网站商城开发目录 1. resize2. 流插入和流提取重载2.1 流插入重载2.2 流提取 3. 常见关系运算符重载4. 赋值重载4.1浅拷贝的默认赋值重载4.2 深拷贝赋值重载实现4.3 赋值重载现代写法 5. 写时拷贝(了解#xff09;6.源码6.1 string.h6.2 test.cpp 1. res… 目录 1. resize2. 流插入和流提取重载2.1 流插入重载2.2 流提取 3. 常见关系运算符重载4. 赋值重载4.1浅拷贝的默认赋值重载4.2 深拷贝赋值重载实现4.3 赋值重载现代写法 5. 写时拷贝(了解6.源码6.1 string.h6.2 test.cpp 1. resize
下面我们来实现一下resize(): resize可以扩容加初始化我们可以自己指定要初始化的字符不指定默认填\0。 这里我们实现时需要分几种情况 第一种情况n _size(): 这里需要要删除数据只保留前n个直接把第n个位置置成\0就行了 第二种情况是n_size且n在_size和_capacity之间 第三种情况是n _capacity: 这两种情况可以一起实现 在这里当n _capacity时reserve()函数会自己扩容 我们来测试一下 2. 流插入和流提取重载
2.1 流插入重载 在之前的文章中我们提到我们自己重载的如果想像正常cout打印那样要把流插入 和 流提取重载到类外面避免this指针抢占第一个参数。 注意这里我们不能使用outc_str()打印打印c_str返回的const char*的指针它是遇到’\0’就停止。 而我们打印string对象是看对应的size 的size是多大就打印多少。 下面我们来测试一下 2.2 流提取 首先我们先来看一下这样写可不可以 我们来测试一下 这里是存在一定错误的。in遇到缓冲区里的空格或者换行的时候它会认为这是你输入多个值的一个区分会自动忽略掉它们不会去提取所以这里就读不到空格和换行那循环就不会结束。 这里我们用get接口来解决 get是istream类的一个成员函数它一次读取一个字符就可以提取到空格和换行。 我们再来测试一下 但是如果遇到这种情况呢 这里还存在一个问题当string对象原来就有数据需要把之前的清掉。这里我们实现一个clear接口。 再来测试一下 这里还有最后一个问题 如果我们输入一个特别长的字符串那这个地方在不断字符的过程中可能会频繁扩容那我们有没有什么办法可以解决一下呢 这里开了一个数组每次先把字符一个个放到数组中满了的话就到s里以字符串的形式然后把i置成0后面继续放数组里。这样做扩容就不会那么频繁了 我们再来测试一下 3. 常见关系运算符重载 我们知道库里string重载了很多关系运算符 这里我们重点实现几个常的。 首先我们来复现 ,我们先考虑使用strcmp来复现: 我们测试一下 貌似这里没啥问题那我们再看一种情况 这里我在字符当中添加了“\0”程序出错了所以上述代码是有问题的。这里我们用memcpy去解决。 我们再来测试一下 写好了一个对于其他的我们只要复现就好了 4. 赋值重载
4.1浅拷贝的默认赋值重载 赋值重载作为类的6个默认成员函数之一我们不写编译器也会默认生成。但是默认生成的赋值重载也是浅拷贝。 所以 和拷贝构造一样如果类中未涉及到资源管理赋值运算符是否实现都可以一旦涉及到资源管理则必须要自己实现。 4.2 深拷贝赋值重载实现 对于赋值重载是有几种情况的 那这里分情况处理其实有点麻烦所以我们干脆不管哪种情况我们都直接释放旧空间然后开新空间拷贝数据 下面我们来测试一下 4.3 赋值重载现代写法 这里我们来用一种更加简单的方法实现 什么意思呢 举个例子 这里我们借用拷贝构造拷贝s3,然后再借用swap函数交换s1和tmp。 这里还有更简单的写法 在这里tmp就是一个临时变量然后调用swap交换。 5. 写时拷贝(了解 写时拷贝就是一种拖延症是在浅拷贝的基础之上增加了引用计数的方式来实现的。 引用计数用来记录资源使用者的个数。在构造时将资源的计数给成1每增加一个对象使用该资源就给计数增加1 当某个对象被销毁时先给该计数减1然后再检查是否需要释放资源如果计数为1说明该对象是资源的最后一个使用者将该资源释放否则就不能释放因为还有其他对象在使用该资源。 6.源码
6.1 string.h
#include iostream
using namespace std;
namespace w
{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(const char* str ):_str(new char[strlen(str)1]),_size(strlen(str)),_capacity(strlen(str)){memcpy(_str, str, _size1);}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);}// string operator(const string s)// {// if (this ! s)// {// char* tmp new char[s._capacity 1];// memcpy(tmp, s._str, s._size1);// delete[] _str;// _str tmp;// _size s._size;// _capacity s._capacity;// }// return *this;// }// string operator(const string s)// {// if (this ! s)// {// string tmp(s);// std::swap(_str, tmp._str);// std::swap(_size, tmp._size);// std::swap(_capacity, tmp._capacity);// }// return *this;// }string operator(string tmp){swap(tmp);return *this;}~string(){delete[] _str;_str nullptr;_size _capacity 0;}const char* c_str() const{return _str;}size_t size() const{return _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];}void reserve(size_t n){if (n _capacity){char* tmp new char[n 1];memcpy(tmp, _str, _size1);delete[] _str;_str tmp;_capacity n;}}void resize(size_t n, char ch \0){if (n _size){_size n;_str[_size] \0;}else{reserve(n);for (size_t i _size; i n; i){_str[i] ch;}_size n;_str[_size] \0;}}void push_back(char ch){if (_size _capacity){// 2倍扩容reserve(_capacity 0 ? 4 : _capacity * 2);}_str[_size] ch;_size;_str[_size] \0;}void append(const char* str){size_t len strlen(str);if (_size len _capacity){// 至少扩容到_size lenreserve(_sizelen);}memcpy(_str _size, str, len1);_size len;}string operator(char ch){push_back(ch);return *this;}string operator(const char* str){append(str);return *this;}void insert(size_t pos, size_t n, char ch){assert(pos _size);if (_size n _capacity){// 至少扩容到_size lenreserve(_size n);}// 添加注释最好size_t end _size;while (end pos end ! npos){_str[end n] _str[end];--end;}for (size_t i 0; i n; i){_str[pos i] ch;}_size n;}void insert(size_t pos, const char* str){assert(pos _size);size_t len strlen(str);if (_size len _capacity){// 至少扩容到_size lenreserve(_size len);}// 添加注释最好size_t end _size;while (end pos end ! npos){_str[end len] _str[end];--end;}for (size_t i 0; i len; i){_str[pos i] str[i];}_size len;}string erase(size_t pos, size_t len npos){assert(pos _size);if (len npos || pos len _size){_str[pos] \0;_size pos;_str[_size] \0;}else{size_t end pos len;while (end _size){_str[pos] _str[end];}_size - len;}return *this;}size_t find(char ch, size_t pos 0){assert(pos _size);for (size_t i pos; i _size; i){if (_str[i] ch){return i;}}return npos;}size_t find(const char* str , size_t pos 0){assert(pos _size);const char* ptr strstr(_str pos, str);if (ptr){return ptr - _str;}else{return npos;}}string substr(size_t pos 0, size_t len npos){assert(pos _size);size_t n len;if (len npos || pos len _size){n _size - pos;}string tmp;tmp.reserve(n);for (size_t i pos; i pos n; i){tmp _str[i];}return tmp;}void clear(){_str[0] \0;_size 0;}bool operator(const string s) const{int ret memcmp(_str, s._str, _size s._size ? _size : s._size);return ret 0 ? _size s._size : ret 0;}bool operator(const string s) const{return _size s._size memcmp(_str, s._str, _size) 0;}bool operator(const string s) const{return *this s || *this s;}bool operator(const string s) const{return !(*this s);}bool operator(const string s) const{return !(*this s);}bool operator!(const string s) const{return !(*this s);}private :char* _str;size_t _size;size_t _capacity;public:const static size_t npos;};const size_t string::npos -1;ostream operator(ostream out, const string s){for (auto ch : s){out ch;}return out;}istream operator(istream in, string s){s.clear();char ch in.get();while (ch || ch \n){ch in.get();}char buff[128];int i 0;while (ch ! ch ! \n){buff[i] ch;if (i 127){buff[i] \0;s buff;i 0;}ch in.get();}if (i ! 0){buff[i] \0;s buff;}return in;}
} 6.2 test.cpp
#include Mystring.hvoid test_string1()
{w ::string s1(hello world);cout s1.c_str() endl;for (size_t i 0; i s1.size(); i){cout s1[i] ;}cout endl;w ::string::iterator it s1.begin();while (it ! s1.end()){cout *it ;it;}cout endl;for (auto ch : s1){cout ch ;}cout endl;
}void test_string2()
{w::string s1(hello world);cout s1.c_str() endl;s1.push_back( );s1.push_back(#);s1.append(hello);cout s1.c_str() endl;w::string s2(hello world);cout s2.c_str() endl;s2 ;s2 #;s2 hello code;cout s2.c_str() endl;}void test_string3()
{w::string s1(helloworld);cout s1.c_str() endl;s1.insert(5, 3, #);cout s1.c_str() endl;s1.insert(0, 3, #);cout s1.c_str() endl;w::string s2(helloworld);s2.insert(5, %%%%%);cout s2.c_str() endl;}void test_string4()
{w::string s1(helloworld);cout s1.c_str() endl;s1.erase(5, 3);cout s1.c_str() endl;s1.erase(5, 30);cout s1.c_str() endl;s1.erase(2);cout s1.c_str() endl;
}void test_string5()
{w::string s1(helloworld);cout s1.find(w,2) endl;}void test_string6()
{w::string s1(hello world);w::string s2(s1);cout s1.c_str() endl;cout s2.c_str() endl;}void test_string7()
{w::string s(hello world);s.resize(8);cout s.c_str() endl;cout s endl;s.resize(13, x);cout s.c_str() endl;cout s endl;s.resize(20, y);cout s.c_str() endl;cout s endl;}void test_string8()
{w::string s(hello world);cin s;cout s endl;
}void test_string9()
{//string s1(bb);//string s2(aaa);//cout (s1 s2) endl;w::string s1(hello);s1 \0;s1 1;w::string s2(hello);s2 \0;s2 2;cout (s1 s2) endl;}void test_string10()
{w::string s1(hello);w::string s2(s1);cout s1 endl;cout s2 endl;w::string s3(xxxxxxxxxxxxx);s1 s3;cout s1 endl;cout s3 endl;
}int main()
{test_string10();return 0;
}