DynamicArray

article/2025/10/2 11:26:46

文章目录

    • 1 DynamicArray设计要点
    • 2 继承关系图和接口实现
    • 3 代码实现
    • 4 代码优化

1 DynamicArray设计要点

类模板

  • 动态确定内部数组空间的大小
  • 实现函数返回数组长度
  • 构造拷贝和赋值操作

2 继承关系图和接口实现

继承关系图
在这里插入图片描述

接口实现
在这里插入图片描述

template < typename T >
class DynamicArray : public Array<T>
{
protected:int m_length;public:DynamicArray(int length);DynamicArray(const DynamicArray<T>& obj);DynamicArray<T>& operator= (const DynamicArray<T>& obj);void resize(int length);int length() const;~DynamicArray();
};

3 代码实现

DynamicArray.h

#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H#include "Array.h"
#include "Exception.h"namespace LemonLib {
template < typename T >
class DynamicArray : public Array<T>
{
protected:int m_length;public:DynamicArray(int length = 0){this->m_array = new T[length];if (this->m_array){m_length = length;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to create DynamicArray obj...");}}DynamicArray(const DynamicArray<T>& obj){this->m_array = new T[obj.m_length];if (this->m_array){for (int i=0; i<obj.m_length; i++){this->m_array[i] = obj.m_array[i];}m_length = obj.m_length;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to copy DynamicArray obj...");}}DynamicArray<T>& operator= (const DynamicArray<T>& obj){if (this != &obj){T* array = new T[obj.m_length];if (array){for (int i=0; i<obj.m_length; i++){array[i] = obj.m_array[i];}T* tmp = this->m_array;this->m_array = array;m_length = obj.m_length;delete[] tmp;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to copy DynamicArray obj...");}}return *this;}void resize(int length){if (length != m_length){T* array = new T[length];if (array){int len = (m_length < length) ? m_length : length;for (int i=0; i<len; i++){array[i] = this->m_array[i];}T* tmp = this->m_array;this->m_array = array;m_length = length;delete[] tmp;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to resize DynamicArray obj...");}}}int length() const{return m_length;}~DynamicArray(){delete[] this->m_array;}
};
}#endif // DYNAMICARRAY_H

main.cpp

#include <iostream>
#include "Object.h"
#include "Exception.h"
#include "List.h"
#include "Seqlist.h"
#include "Staticlist.h"
#include "Dynamiclist.h"
#include "Staticarray.h"
#include "DynamicArray.h"using namespace std;
using namespace LemonLib;int main()
{DynamicArray<int> da(5);for (int i=0; i<da.length(); i++){da[i] = i * i;}for (int i=0; i<da.length(); i++){cout << da[i] << endl;}DynamicArray<int> da1 = da;for (int i=0; i<da1.length(); i++){cout << da[i] << endl;}DynamicArray<int> da2(10);da2 = da1;for (int i=0; i<da2.length(); i++){cout << da2[i] << endl;}da2.resize(10);for (int i=0; i<da2.length(); i++){cout << da2[i] << endl;}da2.resize(3);for (int i=0; i<da2.length(); i++){cout << da2[i] << endl;}return 0;
}

4 代码优化

可以看出DynamicArray类中函数实现存在重复的逻辑,如何进行代码优化呢?

重复代码逻辑的抽象

  • init:对象构造时的初始化操作。
  • copy:在堆空间中申请新的内存,并执行拷贝操作。
  • update:将指定的堆空间作为内部存储数组使用。
#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H#include "Array.h"
#include "Exception.h"namespace LemonLib {
template < typename T >
class DynamicArray : public Array<T>
{
protected:int m_length;T* copy(T* array, int len, int newLen){T* ret = new T[newLen];if (ret != NULL){int size = (len < newLen) ? len : newLen;for (int i=0; i<size; i++){ret[i] = array[i];}}return ret;}void update(T* array, int len){if (array != NULL){T* tmp = this->m_array;this->m_array = array;m_length = len;delete[] tmp;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to update DynamicArray obj...");}}void init(T* array, int len){if (array != NULL){this->m_array = array;m_length = len;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to init DynamicArray obj...");}}public:DynamicArray(int length){init(new T[length], length);}DynamicArray(const DynamicArray<T>& obj){init(copy(obj.m_array, obj.m_length, obj.m_length), obj.m_length);}DynamicArray<T>& operator= (const DynamicArray<T>& obj){if (this != &obj){update(copy(obj.m_array, obj.m_length, obj.m_length), obj.m_length);}return *this;}void resize(int length){if (length != m_length){update(copy(this->m_array, m_length, length), length);}}int length() const{return m_length;}~DynamicArray(){delete[] this->m_array;}
};
}#endif // DYNAMICARRAY_H

http://chatgpt.dhexx.cn/article/npXRQK8j.shtml

相关文章

云途加油站 | 一文读懂 Dynatrace 与 Amazon Lambda 的“双剑合璧心法”

Amazon Lambda 正在掀起企业级云市场的一场小潮流。不少业内人士发现&#xff0c;越来越多的企业正在将 Lambda 函数加入其技术栈中。 这一潮流其实不难理解—— 一则&#xff0c;门槛低。Amazon Lambda为企业进入云计算提供了相对较低的门槛&#xff0c;无需立即全面推行转移…

Dynatrace AppMon最佳实践(一)

经常有客户问我,如何利用Dynatrace捕获必要的应用性能监控信息,从而快速诊断性能问题?所谓捕获必要的信息,即是在应用出现性能下降的时候,PurePath能够捕获导致事务响应缓慢的方法,或是导致事务失败的异常栈信息,亦或是用户请求的上下文参数。如何通过Dynatrace捕获必要…

什么是 Dynatrace 的 Speed Index 度量标准

Dynatrace 中的 Speed Index 是一种度量网页加载速度的标准&#xff0c;它与 Visually Complete 类似&#xff0c;但更加精细。Speed Index 是一个计算值&#xff0c;反映了整个页面的加载速度&#xff0c;并将所有重要元素的渲染时间考虑在内。与 Visually Complete 不同的是&…

dynamic-datasource动态数据源学习

学习链接 spring整合mybatis的核心思路 & 数据源动态切换 & 多数据源事务控制 - 自己的链接&#xff08;本篇文章的上篇&#xff09; Mybatisplus生成代码配置 & p6spy打印sql & mybatis日志打印 & mybatisplus用法 dynamic-datasource-spring-boot-sta…

什么是 Dynatrace 的 Largest Contentful Paint

Dynatrace 多维分析使 Web 开发人员能够沿多个过滤维度分析浏览器监控执行情况。 多维分析页面以图表形式显示选定时间范围内的性能、可用性和错误计数。 可以选择较短的分析范围并以散点图和列表格式查看单个数据点。 页面顶部显示长期&#xff08;时间序列&#xff09;数据…

使用 Dynatrace 对 Node.js 应用的性能数据进行分析

JavaScript Storefront 应用程序的性能问题的表现形式有多种&#xff0c;最典型的是响应时间(response time)的恶化&#xff0c;甚至由于资源耗尽导致的网站完全宕机。 由于 JavaScript Storefront 涉及许多组件&#xff0c;因此确定性能问题的根源可能具有挑战性&#xff0c;如…

dynatrace 详解

dynaTrace Ajax&#xff1a;前端性能分析利器 谢 菊, 性能分析工程师, IBM 谢菊&#xff0c;IBM 中国软件开发中心&#xff08;CDL&#xff09;Lotus 部门的软件性能分析工程师&#xff0c;具有多个产品的性能测试经验&#xff0c;如IBM Portal Accelerator 和IBM Docs。目前正…

dynaTrace Ajax:前端性能分析利器

什么是 dynaTrace Ajax 随着 jQuery、Dojo、YUI 等框架的兴起让构建 Web2.0 应用更加容易&#xff0c;但随之带来的定位等应用问题也越来越难&#xff0c;尤其是与性能相关的。dynaTrace Ajax Edition 是一个强大的底层追踪、前端性能分析工具&#xff0c;该工具不仅能够记录浏…

监控方法基本套路

监控方法基本套路 性能测试监控方法基本套路 1、传统OS定位方法&#xff1a; 通过CPU&#xff0c;内存&#xff0c;IO&#xff0c;网络等指标初步确定问题根据问题进一步确定进程的PID根据进程PID&#xff0c;确定到线程基本TID根据线程的Dump确定堆栈信息根据堆栈信息定位到…

Dynatrace系列之- 如何发现和分析问题

Dynatrace系列之- 如何发现和分析问题 Dynatrace用Problem(问题)表示异常情况&#xff0c;即偏离了正常行为或状态。例如某个服务速度变慢或某个用户登录应用速度变慢。每当检测到问题时&#xff0c;Dynatrace都会引发一个特定的problem event(问题事件)来表示此类异常。 请注…

网址和URL之间的区别:什么是RUI、RUL、URN

调用Web地址是普通的一个问题。一般这种情况&#xff0c;大家都会说&#xff0c;将“URL”放到浏览器中。这里提到的URL &#xff0c;其实不是一个URL &#xff0c;是网址的意思。URI 是统一资源标识符&#xff0c;而 URL 是统一资源定位符。因此&#xff0c;笼统地说&#xff…

146. LRU 缓存机制

LRU 缓存机制 运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (最近最少使用) 缓存机制 。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字…

物理读之LRU(最近最少被使用)的深入解析 (解释LRU_FLAG的含义)

物理读之LRU&#xff08;最近最少被使用&#xff09;的深入解析 转载请注明出处&#xff1a; http://blog.csdn.net/guoyjoe/article/details/38264883 一组LRU链表包括LRU主链&#xff0c;LRU辅助链&#xff0c;LRUW主链&#xff0c;LRUW辅助链&#xff0c;称为一个WorkSet(…

LRU(最近最少使用)缓存机制

title: LRU缓存机制 categories: 操作系统 tags: 操作系统LRUOS计算机知识 LRU(最近最少使用)缓存机制 LRU&#xff1a;最近最少使用缓存机制 其设计的原则依据&#xff1a;如果一个数据在最近一段时间没有被访问到&#xff0c;那么在将来它被访问的可能性也很小。也就是…

LRU简单实现-了解一下?

LRU 算法 LRU 是一种作为缓存的算法&#xff0c;像 CPU 缓存&#xff0c;数据库缓存&#xff0c;浏览器缓存。以及在移动端开发时的图片安缓存&#xff0c;采用 LRU 缓存策略的应用很广泛。在面试中也是常常考察的一个点。当然也有其他缓存方法&#xff0c;常见的策略有三种&a…

LRU总结

文章目录 [146. LRU 缓存机制](https://leetcode-cn.com/problems/lru-cache/)ACM模式LRU 在 MySQL 中的应用LRU 在 Redis 中的应用面试官&#xff1a;来&#xff0c;手写一个线程安全并且可以设置过期时间的LRU缓存 146. LRU 缓存机制 力扣原题 class Node{public int key;pu…

html ur是什么意思_url是什么意思?

实际上,我们在使用互联网的过程中,其中有许多东西都是只会用,而不知道它到底是啥名字,看见了也不理解它是做什么的,比如今天我将和大家说的URL,实际上就是我们在互联网生活中非常常见的一个东西。 web前端学习:打造全网web前端全栈资料库(总目录)看完学的更快,掌握的…

LRU 缓存(Java)

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1…

LRU算法的理解,终于懂了

https://blog.csdn.net/luoweifu/article/details/8297084 以上是让我看明白的博客链接。 下面是我自己的理解&#xff0c;比如下面这道题&#xff1a; 可以这么来看&#xff0c;有一个容量为6的容器&#xff0c;每次放进去一个有编号的球&#xff0c;如果容器中有相同编号…

LRU缓存

一、什么是LRU算法 LRU&#xff0c;Least Recently Used算法&#xff0c;即一种缓存淘汰策略。 计算机的缓存容量有限&#xff0c;若缓存满了则需要删除一些内容&#xff0c;给新的缓存腾出空间&#xff0c;但问题是要删除哪些内容呢&#xff1f;当然是把用的少的缓存删掉&am…