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

网站主页跳转indexseo网络营销推广排名

网站主页跳转index,seo网络营销推广排名,海报设计理念,安阳手机网站制作​ 1. string的接口函数代码实现 string本身的设计并不难实现,对于初学者来说难的是他的一些接口函数,接下来我们把一些常用的接口函数实现一下。 1.1 c_str() 这个函数用于返回指向以空字符开头的C风格字符串的指针。这个函数允许string对象与C风格字…

​ 1. string的接口函数代码实现

string本身的设计并不难实现,对于初学者来说难的是他的一些接口函数,接下来我们把一些常用的接口函数实现一下。

1.1 c_str()

这个函数用于返回指向以空字符开头的C风格字符串的指针。这个函数允许string对象与C风格字符串进行交互。

在下面这个代码里面第一个const表示函数返回的是一个指向常量的指针,即不能通过该指针修改所指向的内容,而第二个const表示这个函数是一个常量成员函数,意味着它可以被常量对象调用,且在函数内部不能修改类的非静态成员变量。即前者不能改变指向,后者不能改变被指向的内容。

const char* c_str() const
{return _str;
}

1.2 size()和capacity()

这两个不用多说,一个是求这个string类型的字符串的size,一个是求这个字符串的capacity。

这两个是不一样的,简单来说就是一桶水,size是现在有多少水,capacity是桶的大小。

PS:在后面加const也是说明内容不可修改。

size_t size() const
{return _size;
}size_t capacity() const
{return _capacity;
}

1.3 reserve()

reserve(x)就是让这个string类型的字符串的capacity变为x大小(前提是x比capacity大)。

我这边代码就是通过开辟新空间,然后把旧的_str内容memcpy(也就是复制)给tmp,接着把_st所指向的内容给delete了,最后把tmp给_str并且把capacity的大小改为n。

void reserve(size_t n)
{if (n > _capacity){char* tmp = new char[n + 2];memcpy(tmp, _str, _size+1);delete[] _str;_str = tmp;_capacity = n;}
}

1.4  push_back()

这个函数就是一个简单的插入,同时函数线检测size和capacity是否已经相等,如果已经相等那就使用reserve对其进行扩容(所以三目运算符是为了防止capacity为0的情况)。又因为size是最后一个的下一个,所以直接_str[_size] = ch,同时++size然后放上\0。

void push_back(char ch)
{if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = ch;++_size;_str[_size] = '\0';
}

​1.5 append()

append用于在字符串的末尾添加字符或字符串。

PS:我们在这里要和上面的push_back做区分,push_back适合一个一个添加字符,而append适合一口气添加多个字符(我们可以理解为字符的拼接)。

计算源字符串长度,若当前容量不足则调用reserve扩容至_size + len + 1以容纳新内容。随后使用memcpy将源字符串(含终止符)复制到原字符串末尾。

void append(const char* str)
{size_t len = strlen(str);if (_size + len > _capacity){reserve(_size+len+1);}memcpy(_str + _size, str, len);_size += len;
}

1.6 erase()

简单来说,这个函数就是给一个要开始删除的位置pos和一个要从这个位置开始删除的长度,然后就会执行删除操作。如果失败(即pos比size还要后面)就assert。

PS:这个npos的意思就是说这个参数可以不填,如果不填的话就是删除从pos开始往后面的所有。

if就是说如果要删除的位置比size还要后面的话,那就直接在pos的位置上放上一个\0,通过这样的方式来表示删除,else就是说明是删除pos到size的一段,通过while循环的方式把后面的内容填到前面,然后size减去len。

PS:在if条件里面的删除并不是真的把东西删了,而是采用了一种类似于stream的方式,即当做后面的东西不存在。

PS:我们在这里不用加上\0,因为我们已经把size位置的\0移动到前面来了。

void 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;}
}

1.7 find()

find就如同它的字面意思一样用于查找字符串里面的字符或者字符串,如果找到了那就返回那个字符的位置。我们在这里使用size_t的原因是防止超过 INT_MAX 时会溢出。

PS:在这里pos是是开始查找的开始位置。举个例子,

假设字符串是"hello world"(索引0-10):

    1.    从开头找'l':

      find('l') → 从索引0开始,找到第一个'l'在索引2,返回2。

    2.    从索引6开始找'l':

     find('l', 6) → 跳过前6个字符("hello "),从'w'(索引6)开始找,找到第二个'l'在索引9,返回9。
这个代码很好理解,就是通过从pos的位置开始查找的方式来返回第一个找到的字符的位置。

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;
}

1.8 resize()

这个函数的作用就是减小或者变大字符串的长度,若 n < 原长度,字符串会(变小截断),若 n > 原长度,字符串会变大(扩展,用ch填充新增部分)。

PS:这里要注意,变小是不会改变内容的,变大才会添加内容。

当新长度n小于当前长度时,直接将长度截断为n并在新末尾添加终止符'\0';当n大于当前长度时,先调用reserve(n)确保容量足够,然后从原长度位置开始用字符ch(默认'\0')填充至n位置,最后更新长度为n并添加终止符。该实现确保了字符串始终以'\0'结尾,且扩展时自动扩容并填充指定字符。

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';}
}
http://www.dtcms.com/wzjs/209973.html

相关文章:

  • 做游戏的php网站有哪些app接入广告变现
  • 网站开发常用形状微信公众号运营
  • 网站备案 子域名建设网站制作公司
  • 香港做网站什么费用优化的意思
  • 做装饰公司网站汉川seo推广
  • 免费的网站生成app口碑营销推广
  • 做公益网站需要什么资质公司网络营销策略
  • 广告设计公司营业执照win10优化大师
  • 陕西疫情最新数据消息seo优化专员工作内容
  • 安陆 网站建设排名优化公司
  • 政府培训如何做网站推广windows优化大师官方免费下载
  • 湛江网站开发企业宣传文案
  • 做多站发布信息的网站seo网站推广是什么意思
  • 网站推广 经典案例济南百度推广优化
  • 建设农家书屋官方网站软文发布平台与板块
  • 什么网站可以做代购seo专员的工作内容
  • 网站美工外包公司石家庄新闻最新消息
  • 网站导航排版布局百度快照收录入口
  • 网站建设视频想做网络推广如何去做
  • 跟公司产品做网站国内重大新闻10条
  • 做网站要用到哪些架包怎样免费给自己的公司做网站
  • 制作asp手机网站各地疫情最新消息
  • 免费网站建设排行榜上海最新疫情
  • 建设网站的五个步骤seo标题优化
  • 做网站的搜索引擎商务软文写作300
  • 物流公司网站开发与淘宝对接 在淘宝卖家中心显示物流信息网站模板之家免费下载
  • 关于学校网站建设申请报告怎样在百度答题赚钱
  • iis 调用wordpressseo关键词排名优化报价
  • 做一视频网站网站制作
  • 关键词搜索引擎网站网络营销岗位招聘信息