当前位置: 首页 > news >正文

宁波网站建设首选品牌宣传广告制作效果图

宁波网站建设首选品牌,宣传广告制作效果图,合肥网站忧化,视频制作免费软件string类的接口 namespace zjw {class string{public:typedef char* iterator;typedef const char* const_iterator;private:char* _str;int _size;int _capacity;};这里的迭代器直接使用原生指针来封装。 _str为指向string数组的首地址的指针。 _size为string数组的大小。 …string类的接口 namespace zjw {class string{public:typedef char* iterator;typedef const char* const_iterator;private:char* _str;int _size;int _capacity;}; 这里的迭代器直接使用原生指针来封装。 _str为指向string数组的首地址的指针。 _size为string数组的大小。 _capacity为string数组的容量 基本函数 实现 函数返回string的首地址 实现 函数返回string的尾地址 实现 函数返回string的大小 实现 函数返回string的容量 iterator begin(){return _str;}iterator end(){return _str_size;}size_t size(){return _size;}size_t capacity(){return _capacity;}如果一个string类不能被修改的话就无法调用非const的成员函数 const_iterator begin() const{return _str;}const_iterator end() const{return _str _size;}默认构造以及析构函数 string(const char* str ):_size(strlen(str)){_capacity _size;_str new char[_capacity 1];strcpy(_str, str);}~string(){ delete[]_str;_str nullptr;_size _capacity 0;}这里有一个问题就是默认构造传的缺省参数可以是nullptr 吗 答案是不行的因为strlen要将str解引用找’\0’,如果传nullptr的话对空指针解引用就会出错。 这里也不可以传单字符‘\0’,因为这里的str是const char* 类型而’\0’是char 类型 运算符重载下标访问函数 char operator[](size_t pos){assert(pos_size);return _str[pos];}const char operator[](size_t pos) const{assert(pos _size);return _str[pos];}下标为_size的地方存的是’\0’,所以不用访问pos_size,为了让const迭代器不修改对于下标的值修改上面得到下面对上面进行函数重载 reserve函数 void reserve(size_t n){if (n _capacity){char* tmp new char[n 1];strcpy(tmp, _str);delete[]_str;_str tmp;_capacity n;}}注意这里多开一个是为了存’\0’; push_back()函数 void push_back(char ch){if (_capacity _size){reserve(_capacity 0 ? 4 : _capacity * 2);}_str[_size] ch;_size;_str[_size] \0;}原来下标是_size的地方是‘\0’,然后之间在_size的地方放入ch,_size,染后在补一个’\0’;要插入数据的一半都要扩容 append函数 void append(const char* str){size_t len strlen(str);if (_size len _capacity){reserve(_size len);}strcpy(_str _size, str);_size len;//_str[_size] \0;}尾插一个字符串如果string的大小要插入的字符串大小_capacity,就扩容到_size len刚好strcpy会从str开始直到遇到‘\0’一个字节一个字节拷贝到_str _size原字符串’\0’的地方这里会把str字符串后面的‘\0’也拷贝过来。 运算符重载字符以及字符串 string operator(char ch){push_back(ch);return *this;}string operator(const char* str){append(str);return *this;}在这里传引用返回是因为_str指向的空间是在堆上开的出函数不会被销毁所以可以传引用返回 insert函数(插入字符) void insert(size_t pos, char ch){assert(pos_size);if (_capacity _size){reserve(_capacity 0 ? 4 : _capacity * 2);}size_t end _size;while (end pos){_str[end1] _str[end];end--;}_str[pos] ch;_size;}上面这个写法可以吗 是不可以的 怎么修改呢 void insert(size_t pos, char ch){assert(pos_size);if (_capacity _size){reserve(_capacity 0 ? 4 : _capacity * 2);}size_t end _size1;while (end pos){_str[end] _str[end-1];end--;}_str[pos] ch;_size;}这样就可以了我们从’\0’的下一个位置开始end,此时end结束的条件是0所以不会陷入循环这里和顺序表的insert很像可以参考顺序表那里。 earse函数 void earse(size_t pos, size_t len npos){assert(pos _size);if (len npos || pos _size-len){_str[pos] \0;_size pos;}else{strcpy(_str pos, _str pos len);_size - len;}}删除从pos位置开始的len个字符长度的字符如果len大于剩下的字符就全删了这里给的缺省值为npos-1可以认为是很大的数绝对超过了pos后面的字符数我们要在string里面声明一个npos,在类外面定义初始化。 如果lennpos或者lenpos_size,就始要将pos开始后面的字符串全删除我们直接在pos位置放’\0’即可 _sizepos; 如果没有超过字符串 insert插入字符串 void insert(size_t pos, const char* str){size_t len strlen(str);if (_size len _capacity){reserve(_size len);}size_t end _size len;while (end pos len - 1){_str[end] _str[end - len];end--;}strncpy(_str pos, str, len);_size len;}void test6(){string str;str.push_back(a);str.push_back(a);str.push_back(b);str.insert(2, hello);cout str.c_str();}swap void swap(string str){std::swap(_str, str._str);std::swap(_size, str._size);std::swap(_capacity, str._capacity);}void test12(){ string str1;string str2;str1 hello;str2nihao;cout str1:str1 endl;cout str2:str2 endl;str1.swap(str2);cout str1: str1 endl;cout str2: str2 endl;}这里我们自己实现的swap是类成员函数但是#include algorithm 这个头文件库里面也有一个swap,swap全局也有一个非成员函数swap 我们可以发现算法库中的swap需要完成三次的拷贝以及一次析构临时变量c的析构,而string里面定义一个全局的swap,就是为了防止调用算法库里面的swap,因为会先在全局找然后会在展开的库里找而全局的swap实现只需要调用类里面的swap即可 void swap(string x, string y){x.swap(y);cout 没使用库里的 endl;}void test13(){string str1;string str2;str1 hello;str2 nihao;cout str1: str1 endl;cout str2: str2 endl;swap(str1, str2);//检测是调用库里的还是全局的cout str1: str1 endl;cout str2: str2 endl;}赋值以及拷贝构造 string(const string s){string tmp(s._str);swap(tmp);}string operator(string tmp){swap(tmp);return *this;}根据调试发现 老版本赋值 string operator(const string s){char* tmp new char[s._capacity 1];strcpy(tmp, s._str);delete[] _str;_str tmp;_size s._size;_capacity s._capacity;return *this;}find函数查找字符 size_t find(char ch, size_t pos 0){for (int i pos; i _size; i){if (_str[i] ch)return i;}return npos;}从pos位置开始查找如果pos使用缺省则从第一个位置开始查找从pos位置开始遍历如果找到返回下标如果找不到返回npos void test7(){string str;str.push_back(a);str.push_back(a);str.push_back(b);str.insert(2, hello);cout endl;int ret str.find(b, 0);cout ret;}find函数查找子串 size_t find(const char* sub, size_t pos 0) const{assert(pos _size);//下标为_size的是‘\0’const char* ptr strstr(_str pos, sub);if (ptr ! nullptr)//找到了但是strstr返回的是找到子串的起始地址-字符串起始地址就是子串相对起始位置的长度{return ptr - _str;}else{return npos;}}void test8(){string str;str beijing huanyingni zhangjiawang;int ret str.find(zhangjiawang);cout ret;}substr函数 string substr(size_t pos 0, size_t len npos) const{string substr;if (pos _size - len){for (int i pos; i _size; i){substr _str[i];}}else{for (int i pos; i pos len; i){substr _str[i];}substr \0;}return substr;}从pos位置开始取取len个长度分两种情况如果从pos开始还没取到len长就结束就取到结尾遍历pos到_sizestring substr 保存遍历的值. 第二种遍历pos到poslenstring substr 保存遍历的值.最后记得加‘\0’; 运算符重载比较函数 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 strcmp(s1.c_str(), s2.c_str());}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 !(s1 s2);}注意这里为什么要搞成全局的呢 void test10(){string str1;string str2;str1 abc;str2 aba;cout (str1 str2) endl;cout (aba str2) endl;//2cout (str2 aba) endl;}因为第二种的话不满足类成员做左操作数全局的话就可以而第三个是会搞一个类型转换. void test10(){string str1;string str2;str1 abc;str2 aba;cout (str1 str2) endl;cout (aba str2) endl;cout (str2 aba) endl;cout (str1str2) endl;cout (str1 str2) endl;cout (str1str2) endl;cout (str1 str2) endl;cout (str1!str2) endl;}运算符重载流插入 ostream operator(ostream out, const string s){for (auto e : s)//遍历一个一个输出{out e;}return out;}有返回值是为了可以连续流插入 运算符重载流提取 版本一 istream operator(istream in, string s){char ch;in ch;//读取字符到chwhile (ch ! ch ! \n)//读到‘ ’或‘\n’结束输入{s ch;//将ch加进去in ch;//循环读取}return in;}这样写会有一个问题就是cin和scanf一样默认‘\n’和‘ ’是分割符不会进行读取所以ch不会是空格或换行所以陷入死循环. 版本2 c语言中可以用getchar来读取而c中存在get就可以读空格 istream operator(istream in, string s){char ch;in.get(ch);while (ch ! ch ! \n){s ch;in.get(ch);}return in;}void test11(){string str1;string str2;cin str1;//str2;//str2;cout str1;//cout str1.capacity();}版本3 由于我们在sch会出现频繁扩容影响效率我们应该怎么解决呢 我们可以提前开好空间但是不知道应该开多大.假如说我们开128个 istream operator(istream in, string s){char ch;in.get(ch);s.reserve(128);while (ch ! ch ! \n){s ch;in.get(ch);}return in;}void test11(){string str1;string str2;cin str1;//str2;//str2;//cout str1;cout str1.capacity();}两个数据开128就会有极大的浪费多一点还好 版本4 istream operator(istream in, string s){s.clear();//可能我们s里面之前有数据但是流提取是要覆盖的char ch;ch in.get();char buff[128];int i 0;while (ch ! ch ! \n){buff[i] ch;if (i 127){buff[127] \0;s buff;i 0;}ch in.get();}if (i 0){buff[i] \0;s buff;}return in;}这里感觉可以类比冯诺依曼体系buff就相当于内存先将输入的值放在内存buff里面等到装满了在一次性给s,减少搬运次数.避免了一次空间开的很大而数据只有几个 clear void clear(){_size 0;_str[0] \0;}c_str 将const string* 转化为const char* const char* c_str() const{return _str;}cout不能直接处理自定义类型string,但是可以使用c_str将string转成常量字符串内置类型就可以直接打印 源码 .h #pragma once #define _CRT_SECURE_NO_WARNINGS using namespace std; #includeassert.h #includeiostream #includealgorithm namespace zjw {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 ):_size(strlen(str)){_capacity _size;_str new char[_capacity 1];strcpy(_str, str);}~string(){delete[]_str;_str nullptr;_size _capacity 0;}size_t size(){return _size;}size_t capacity(){return _capacity;}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];strcpy(tmp, _str);delete[]_str;_str tmp;_capacity n;}}void push_back(char ch){if (_capacity _size){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){reserve(_size len);}strcpy(_str _size, str);_size len;//_str[_size] \0;}string operator(char ch){push_back(ch);return *this;}string operator(const char* str){append(str);return *this;}void insert(size_t pos, char ch){assert(pos _size);if (_capacity _size){reserve(_capacity 0 ? 4 : _capacity * 2);}size_t end _size 1;while (end pos){_str[end] _str[end - 1];end--;}_str[pos] ch;_size;}const char* c_str() const{return _str;}void earse(size_t pos, size_t len npos){assert(pos _size);if (len npos || pos _size - len){_str[pos] \0;_size pos;}else{strcpy(_str pos, _str pos len);_size - len;}}bool empty(){return _size 0;}void resize(size_t n, char ch \0){if (n _size){_str[n] \0;_size n;}else{reserve(n);for (size_t i _size; i n; i){_str[i] ch;}_size n;}}void insert(size_t pos, const char* str){size_t len strlen(str);if (_size len _capacity){reserve(_size len);}size_t end _size len;while (end pos len - 1){_str[end] _str[end - len];end--;}strncpy(_str pos, str, len);_size len;}size_t find(char ch, size_t pos 0){for (int i pos; i _size; i){if (_str[i] ch)return i;}return npos;}size_t find(const char* sub, size_t pos 0) const{assert(pos _size);const char* ptr strstr(_str pos, sub);if (ptr ! nullptr){return ptr - _str;}else{return npos;}}string substr(size_t pos 0, size_t len npos) const{string substr;if (pos _size - len){for (int i pos; i _size; i){substr _str[i];}}else{for (int i pos; i pos len; i){substr _str[i];}substr \0;}return substr;}void swap(string str){std::swap(_str, str._str);std::swap(_size, str._size);std::swap(_capacity, str._capacity);}string(const string s){string tmp(s._str);swap(tmp);}string operator(string tmp){swap(tmp);return *this;}string operator(const string s){char* tmp new char[s._capacity 1];strcpy(tmp, s._str);delete[] _str;_str tmp;_size s._size;_capacity s._capacity;return *this;}void clear(){_size 0;_str[0] \0;}friend istream operator(istream in, string s);public:static const int npos;private:char* _str;int _size;int _capacity;};const int string::npos -1;void swap(string x, string y){x.swap(y);cout 没使用库里的 endl;}istream operator(istream in, string s){s.clear();char ch;ch in.get();char buff[128];int i 0;while (ch ! ch ! \n){buff[i] ch;if (i 127){buff[127] \0;s buff;i 0;}ch in.get();}if (i 0){buff[i] \0;s buff;}return in;}//istream operator(istream in, string s)//{// // char ch;// // in.get(ch);// // s.reserve(128);// while (ch ! ch ! \n)// {// // // s ch;// in.get(ch);// }// // // // // return in;//}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 strcmp(s1.c_str(), s2.c_str());}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 !(s1 s2);}ostream operator(ostream out, const string s){for (auto e : s){out e;}return out;}//istream operator(istream in, string s)//{// s.clear();// char ch;// // ch in.get();// //in ch;// s.reserve(128);// while (ch ! ch ! \n)// {// // s ch;// ch in.get();// //in ch;// }// return in;//////////}void test1(){string str;str a;str b;str beijing;string::iterator it str.begin();while (it ! str.end()){cout *it ;it;}}void test2(){string str;str.push_back(a);str.push_back(a);str.push_back(b);str.push_back(a);str.push_back(a);string::iterator it str.begin();while (it ! str.end()){cout *it ;it;}cout str[2];}void test3(){string str;str.append(stringbj);for (auto e : str){cout e ;}}void print_string(const string it){string::const_iterator res it.begin();while (res ! it.end()){cout *res ;res;}}void test4(){string str;str abc;str.append(stringbj);string::iterator it str.begin();while (it ! str.end()){cout *it ;it;}//str.insert(0, g);for (auto e : str){cout e ;}cout endl;// str.earse(1,string::npos);*//* for (auto e : str){cout e ;}*/// print_string(str);}void test5(){string str;str.push_back(a);str.push_back(a);str.push_back(b);str.resize(10);/* string::iterator it str.begin();while (it ! str.end()){cout *it ;it;}*/cout str.c_str();}void test6(){string str;str.push_back(a);str.push_back(a);str.push_back(b);str.insert(2, hello);cout str.c_str();}void test7(){string str;str.push_back(a);str.push_back(a);str.push_back(b);str.insert(2, hello);cout endl;int ret str.find(b, 0);cout ret;}void test8(){string str;str beijing huanyingni zhangjiawang;int ret str.find(zhangjiawang);cout ret;}void test9(){string str;str beijing huanyingni zhangjiawang;string op str.substr(0, 10);cout op.c_str();}void test10(){string str1;string str2;str1 abc;str2 aba;cout (str1 str2) endl;cout (aba str2) endl;cout (str2 aba) endl;cout (str1str2) endl;cout (str1 str2) endl;cout (str1str2) endl;cout (str1 str2) endl;cout (str1!str2) endl;}void test11(){string str1;string str2;cin str1;//str2;//str2;//cout str1;cout str1.capacity();}void test12(){ string str1;string str2;str1 hello;str2nihao;cout str1:str1 endl;cout str2:str2 endl;str1.swap(str2);cout str1: str1 endl;cout str2: str2 endl;}void test13(){string str1;string str2;str1 hello;str2 nihao;cout str1: str1 endl;cout str2: str2 endl;swap(str1, str2);cout str1: str1 endl;cout str2: str2 endl;}void test14(){string str2;str2 nihao;string str1(str2);}} .cpp #include标头.hint main() {zjw::test11(); }
http://www.zqtcl.cn/news/364688/

相关文章:

  • 视频网站seo实战做企业网站一般用什么服务器
  • icp备案 网站负责人免费直播sdk
  • 网站制作和如何推广动画专业学什么
  • 北京一家专门做会所的网站基于ssh框架的网站开发流程
  • 可以在自己的电脑上做网站吗陕西商城网站建设
  • 深圳网站建设工作室郴州有什么好玩的地方
  • 用dw做的网站怎么发到网上竹妃怎么在公众号里做网站
  • 杭州网站优化搜索黑龙江公共资源交易网官网
  • 动易网站 首页模板修改平台网站是什么
  • 营销网站更受用户欢迎的原因是英文网站的建设意义
  • 学网站建设基础河北省建设网站的网站首页
  • 铜仁市住房和城乡建设部网站延边有没有做网站的
  • 如何做ppt的模板下载网站移动端网站的优点
  • 网站域名没有实名认证微信平台开发技术
  • 自己用电脑做虚拟机怎么建网站个人网站 icp 代理
  • 嘉兴网站建设999 999中国建设招标网是私人网站吗
  • 网站程序设置主页面零基础学wordpress pdf下载
  • 网站代码优化有哪些专做立体化的网站
  • 单县网站定制培训机构专业
  • 网站防红链接怎么做网站建设中提示页面
  • 网站开发和游戏开发的区别互联网服务平台投诉
  • 杭州定制网站公司出名的设计网站
  • 网站查询访问注册电气工程师考试
  • 北京企业网站推广哪家公司好电商平台代运营
  • 北京快速建站模板信息管理系统网站开发
  • 做网站后台需要写代码吗做网站收多少钱
  • 企业手机网站建设咨询为企业设计一个网站
  • 做网站平台成本珠海自适应网站设计
  • 做网站手机端需要pc端的源代码吗经营网站需要注意什么
  • 域名购买之后怎么做网站做+淘宝客最大的网站是叫什么