以c的视角来理解c++的多态
1.概述
c++是一门混合型编程语言,即支持面向对象有支持面向过程,其中又以面向对象为主。c++的三大主要特性:“继承”,“封装”,“多态”中,又以“多态”最难以理解,本文将通过c的视角来诠释c++的多态。
c++是一门混合型编程语言,即支持面向对象有支持面向过程,其中又以面向对象为主。c++的三大主要特性:“继承”,“封装”,“多态”中,又以“多态”最难以理解,本文将通过c的视角来诠释c++的多态。
任何平台随着用户规模的扩大、功能不断的添加,持久化数据库层承受的读写压力会越来越大,一旦数据库承压过大会导致读写性能陡然下降,严重时会导致大量的业务请求超时,进而发生“雪崩”引发严重的故障。
在业务层和数据库持久层之间引入一层内存缓存层,对于复杂且业务逻辑上不会变化的查询结果进行缓存,业务请求再次发起时,每次都先从缓存层中查询,从而大大减少对数据库的查询,减小对数据库的压力。
类型 | 稳定性 | 扩展性 | 通用性 | 对代码的侵入性 |
---|---|---|---|---|
应用层缓存 | 应用会频繁重启更新,缓存易丢失,稳定性不佳 | 差,受限于进程的资源限制 | 差,不同应用难以复用 | 代码侵入性小,无网络操作,只需要操作应用进程内存 |
本地单点缓存 | 独立的缓存应用(redis、memcached等),不会频繁重启,稳定性一般,但有单点故障问题 | 一般,受限于单服务器资源限制 | 一般,业务应用和缓存应用有强耦合 | 代码侵入性一般,需要引入对应的api通常有网络操作 |
分布式内存缓存 | 分布式系统,具备故障恢复功能,无单点故障问题,稳健性佳 | 好,支持水平扩展 | 好,对业务层提供通用接口,后端具体的缓存应用对业务透明 | 代码侵入性一般,需要引入通用的api通常有网络操作 |
只给要删除的数据节点的指针,指针不会指向链表尾。
正常删除一个链表中的节点我们先要获取要删除节点的前驱节点的指针pre,然后执行pre->next = pre->next->next来把要删除的节点从链表中剔除。其实这里我们可以转换一下思维方式不一定要通过删除节点的方式来删除数据,我们可以通过复制要删除节点的下一个节点的数据到当前要删除的节点中,然后再把要删除节点的下一个节点给删除,就能达到删除指定节点上数据的要求。
回文最初的概念是应用在字符串上的,比如”abccba”和“abcdcba”都是回文字符串。判断是否是回文字符串的算法也很简单,使用两个下标i、j,i从头开始向后遍历,j从尾开始向前遍历,只要i < j就一直遍历,在遍历过程中如果i和j位置上的字符不相同,则该字符串必然不是回文的并立即停止遍历,如果遍历结束后都没遇到不相同的字符,则该字符串是回文的。
可以使用两个指针来实现,一个cur指针先从链表头往后遍历n个节点,然后一个pre指针(初始为NULL)和cur指针一起在链表中往后遍历直到cur指向NULL,而此时pre指向的就是要被删除的倒数第n个节点的前驱,如果pre为空,则说明要删除的是链表头节点,否则更新一下pre的next指针即可,即pre->next = pre->next->next。
如果链表有环,那么在遍历链表时则会陷入死循环,利用这个特征,我们可以设计这样的算法。
近期评论