wordpress缺陷,济南seo网站优化,深圳前500强企业名单,木质家居 技术支持 东莞网站建设1.string的成员变量
模拟实现string只需要三个成员变量#xff0c;capacity#xff0c;size#xff0c;_str#xff0c;也就是容量#xff0c;数据大小#xff0c;指向字符串的指针。 2.string的构造函数
2.1 使用字符串构造
使用字符串来构造一个string类的对象capacitysize_str也就是容量数据大小指向字符串的指针。 2.string的构造函数
2.1 使用字符串构造
使用字符串来构造一个string类的对象这个我建议不需要使用初始化列表因为很容易出错并且效率的提升不大。需要注意的是定义的顺序最好和初始化的顺序一致。_str的空间需要多开一个用以存放\0然后将str这个字符串拷贝到_str。 2.2 无参构造
无参构造必须开一个空间来存放\0而不是将_str置为nullptr不然在调用时可能会发生对空指针的解引用。 2.3通用构造
前面两个构造函数太冗余了直接合并成一个就可以了就是空字符空字符的末尾就是\0。 3.string的析构函数
析构函数很简单就是先delete先清理资源再释放空间再将容量和大小置为0. 4 c_strsizecapacity
c_str返回值是const char*直接返回_str即可。 size和capacity就直接返回成员函数即可。 5. operator[]
这里的返回值是引用因为我们可能需要修改这个字符可以加一个assert判断pos是否合法。 6.普通迭代器和const迭代器
普通迭代器和const迭代器的区别就是const迭代器指向的内容不能被修改所以需要在成员函数后面加上const修饰*this. 7.reserver
可以开一个新的capacity为n空间然后将数据拷贝进去释放掉原来的_str然后将新的字符串赋值给_str将capacity置为n.需要注意的是开空间要比n多一个用来存放\0。 8.push_back
首先需要判断一下空间是否满了满了的话则需要扩容。然后在_size的位置插入字符ch即可再将_size,最后将字符串末尾置为\0。 9.append
首先计算一下当前的_sizelen是否大于容量如果大于则需要扩容直接使用reserve扩容即可。然后在_str_size这个位置开始拷贝str最后将_size更新即可。 10.operator
直接复用push_back和append即可。 11.insert
在pos位置插入一个字符可以先判断一下pos是否合理再判断容量是否足够然后开始挪动字符需要注意的是pos是size_t类型与int类型的end比较的话while循环会出现死循环所以需要强转一下循环结束时就可以在pos位置插入字符了再将_size。 插入字符串的话也差不多但是需要使用strncpy控制一下长度因为strcpy会把\0也拷贝进去这样的话就覆盖掉一个字符了。 12.erase
erase就是从pos位置开始删除len个字符len这里我们可以给一个缺省值npos。接下来判断如果没有给len则从pos位置开始将后面的字符串全部删除如果poslen_size也就是要删除的部分超过了_size这两种情况都可以在pos位置置为\0因为字符串以\0结尾就相当于删除了后面的字符再将_size置为pos。 13.swap
这里可以使用库里面的函数模板来实现。 14.find
查找字符的话就是直接暴力即可如果没找到则返回npos。 查找字符串可以使用strstr这个函数返回的是指针如果返回的是空指针则说明没有找到否则可以使用返回的指针减去指向原字符串的指针。 15.substr
substr也是要首先考虑len的长度然后我们创建一个string的对象str先开end-pos个空间然后使用运算符重载进行插入最后返回str。还需要注意的是返回值是进行了浅拷贝创建了临时变量实际上str已经销毁了返回的是str的临时对象而string内部有资源浅拷贝的话有可能会发生问题所以需要写一个拷贝构造来完成深拷贝。 16.拷贝构造(深拷贝 17.operator
\ 18.clear
clear是为了清理数据不会释放空间。 源码
#pragma once
#includeiostream
#includeassert.h
using namespace std;static size_t npos -1;
namespace zxf
{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()//{// _capacity 0;// _size 0;// _str new char[1];// _str[0] \0;//}string(const char* str){_capacity strlen(str);_size _capacity;_str new char[_capacity1];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;//}//现代写法string(const string s){string tmp(s._str);swap(tmp);}~string(){delete[] _str;_str nullptr;_capacity 0;_size 0;}const char* c_str() const{return _str;}size_t size() const{return _size;}size_t capacity() const{return _capacity;}void reserve(size_t n){char* tmp new char[n 1];strcpy(tmp, _str);delete[]_str;_str tmp;_capacity n;}void push_back(char ch){if (_size _capacity){size_t newcapacity _capacity 0 ? 4 : _capacity * 2;reserve(newcapacity);}_str[_size] ch;_size;_str[_size] \0;}void append(const char* str){size_t len strlen(str);if (_size len _capacity){reserve(_size len);}strcpy(_str _size, str);_size len;}void insert(size_t pos,char ch){assert(pos 0 pos _size);if (_size _capacity){size_t newcapacity _capacity 0 ? 4 : _capacity * 2;reserve(newcapacity);}int end _size;while (end (int)pos){_str[end1] _str[end];end--;}_str[pos] ch;_size;}void insert(size_t pos, const char* str){assert(pos _size);size_t len strlen(str);if (_size len _capacity){reserve(_size len);}int end _size;while (end (int)pos){_str[end len] _str[end];end--;}strncpy(_str pos, str,len);_size len; }void erase(size_t pos, size_t len npos){assert(pos _size);if (len npos || pos len _size){_str[pos] \0;_size pos;}else{strcpy(_str pos, _str pos len);_size - len;}}void swap(string s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}size_t find(char ch,size_t pos 0){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){const char* ptr strstr(_str, str);if (ptr nullptr){return npos;}else{return ptr - _str;}}void clear(){_str[0] \0;_size 0;}string substr(size_t pos 0,size_t len npos){assert(pos _size);size_t end pos len;if (len npos || pos len _size){end _size;}string str;str.reserve(end - pos);for (size_t i pos; i end; i){str _str[i];}return str;}string operator(char ch){push_back(ch);return *this;}string operator(const char* str){append(str);return *this;}//string operator(const string s)//{// if (this ! s)// {// char* tmp new char[s._capacity 1];// strcpy(tmp, s._str);// delete[] _str;// _str tmp;// _size s._size;// _capacity s._capacity;// }// return *this;//}string operator(string s){swap(s);return *this;}const char operator[](size_t pos) const{assert(pos _size);return _str[pos];}char operator[](size_t pos) {assert(pos _size);return _str[pos];}private:size_t _capacity;size_t _size;char* _str;};ostream operator(ostream out, const string s){for (size_t i 0; i s.size(); i){out s[i];}return out;}istream operator(istream in,string s){char ch;in ch;while (ch ! ch ! \n){s ch;in ch;}return in;}void Print_string(const string s){for (int i 0; i s.size(); i){cout s[i];}cout endl;}void test_string1(){string s1(hello world);couts1.c_str() endl;string::iterator it s1.begin();while (it ! s1.end()){cout *it;it;}cout endl;string::const_iterator cit s1.begin();while (cit ! s1.end()){cout *cit;cit;}cout endl;}void test_string2(){string s1(hello world);s1 ;s1 zxf;string::iterator it s1.begin();while (it ! s1.end()){cout *it;it;}cout endl;}void test_string3(){string s1(hello world);string s2 s1;cout s2.c_str() endl;string s3 s1.substr(2, 4);cout s3.c_str() endl;cout s3 endl;}
}今天的分享到这里就结束了感谢大家的阅读