leetcode 303

leetcode 303

题目

在这里插入图片描述

例子

在这里插入图片描述

思路

使用数组存储[0, i] 的vals 值之和, sum[i] 表示 第0个元素到第(i-1)个元素之和。

代码

class NumArray {
    vector<int> sum;
public:
    NumArray(vector<int>& nums) {
        int n = nums.size();
        sum.resize(n+1);
        
        for(int i=0; i<n; i++){
            sum[i+1] = sum[i] + nums[i];
        }
    }
    
    int sumRange(int left, int right) {
        
        return sum[right+1] - sum[left];
     
    }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * int param_1 = obj->sumRange(left,right);
 */

介绍深拷贝和浅拷贝

深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中常用的两个概念,用于描述在复制对象或数据结构时发生的不同方式。以下是它们的区别:

  1. 浅拷贝(Shallow Copy):
    浅拷贝是指将一个对象的值复制到另一个对象,但只复制对象本身,而不复制对象引用的内容。因此,新对象和原始对象引用相同的内存地址,如果原始对象中包含指向其他对象的指针或引用,浅拷贝后的对象仍然会共享这些指针或引用。这可能导致多个对象共享相同的资源,当一个对象修改资源时,会影响到其他对象。

  2. 深拷贝(Deep Copy):
    深拷贝是指将一个对象的值复制到另一个对象,同时也复制对象引用的内容。这意味着新对象和原始对象引用不同的内存地址,且它们的内容是完全独立的。深拷贝会递归地复制对象的所有内容,包括嵌套对象、指针指向的对象等。因此,即使一个对象被修改,不会影响到另一个对象。

在编程中,深拷贝通常需要额外的内存和时间开销,因为需要复制整个对象及其所有嵌套内容。而浅拷贝则更为高效,但可能会导致意外的行为,特别是在多个对象共享同一资源时。

在设计程序时,需要根据需求和情况选择适合的拷贝方式。如果需要独立的对象副本,应该使用深拷贝;如果只是需要共享数据,可以使用浅拷贝。在C++中,通过重载拷贝构造函数和赋值运算符可以实现深拷贝。

浅拷贝和深拷贝的区分:

  1. 内存管理:浅拷贝只是简单地复制指针,使得新对象和原对象共享同一块内存空间,而深拷贝会为新对象分配新的内存空间,并将原对象的数据复制到新的内存空间中。

  2. 析构函数:深拷贝通常会定义自己的析构函数来释放动态分配的内存,确保在对象被销毁时内存得到正确释放,而浅拷贝可能会导致内存泄漏或悬挂指针的问题。

  3. 拷贝构造函数:深拷贝会在拷贝构造函数中进行数据的深度复制,而浅拷贝只是简单地复制指针,导致新旧对象共享同一内存地址。

  4. 赋值运算符重载:深拷贝通常会重载赋值运算符 =,以确保在对象赋值时进行深度复制,而浅拷贝可能会导致赋值后的对象共享数据。

  5. 数据的独立性:通过修改一个对象的数据,观察另一个对象的数据是否受影响,如果受影响则是浅拷贝,如果不受影响则是深拷贝。

浅拷贝例子

以下是一个简单的示例,展示了浅拷贝的概念和效果:

#include <iostream>
#include <vector>

using namespace std;

class MyClass {
public:
    int* data;

    // 构造函数
    MyClass(int value) {
        data = new int(value);
    }

    // 拷贝构造函数(浅拷贝)
    MyClass(const MyClass& other) {
        data = other.data; // 浅拷贝,共享同一内存地址
    }

    // 析构函数
    ~MyClass() {
        delete data;
    }
};

int main() {
    // 创建对象 a
    MyClass a(5);

    // 浅拷贝对象 a 到对象 b
    MyClass b = a;

    // 修改对象 b 的值
    *(b.data) = 10;

    // 输出对象 a 和对象 b 的值
    cout << "a.data: " << *(a.data) << endl; // 输出 10,因为对象 a 和对象 b 共享同一内存地址
    cout << "b.data: " << *(b.data) << endl; // 输出 10

    return 0;
}

在上面的示例中,我们定义了一个名为 MyClass 的类,其中包含一个指向整数的指针 data。在拷贝构造函数中,我们进行了浅拷贝,即将对象 otherdata 指针赋值给当前对象的 data 指针,导致两个对象共享同一内存地址。

main 函数中,我们创建了对象 a,然后通过浅拷贝将其复制到对象 b。当我们修改对象 b 的值时,对象 a 的值也被修改,因为它们共享同一内存地址。这就是浅拷贝的效果,可能导致意外的行为和数据共享问题。

深拷贝

以下是一个简单的示例,展示了深拷贝的概念和效果:

#include <iostream>

class MyArray {
private:
    int size;
    int* data;

public:
    // 构造函数
    MyArray(int s) : size(s), data(new int[s]) {}

    // 拷贝构造函数(深拷贝)
    MyArray(const MyArray& other) : size(other.size), data(new int[other.size]) {
        for (int i = 0; i < size; i++) {
            data[i] = other.data[i];
        }
    }

    // 析构函数
    ~MyArray() {
        delete[] data;
    }

    // 打印数组元素
    void print() {
        for (int i = 0; i < size; i++) {
            std::cout << data[i] << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    // 创建对象 a
    MyArray a(5);
    for (int i = 0; i < 5; i++) {
        a.data[i] = i + 1;
    }

    // 深拷贝对象 a 到对象 b
    MyArray b = a;

    // 修改对象 b 的值
    b.data[0] = 10;

    // 输出对象 a 和对象 b 的值
    std::cout << "a: ";
    a.print(); // 输出 1 2 3 4 5
    std::cout << "b: ";
    b.print(); // 输出 10 2 3 4 5

    return 0;
}

在上面的示例中,我们定义了一个名为 MyArray 的类,其中包含一个整数大小和一个指向整数数组的指针 data。在拷贝构造函数中,我们进行了深拷贝,即为新对象分配了新的内存空间,并将原对象的数据复制到新的内存空间中,从而避免了数据共享问题。

main 函数中,我们创建了对象 a,并为其数组赋值。然后通过深拷贝将对象 a 复制到对象 b。当我们修改对象 b 的值时,对象 a 的值不会受到影响,因为它们拥有各自独立的内存空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469866.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot项目讲解

技术栈 vue(前端) springboot(后端主框架) mybatis&#xff08;ORM&#xff0c;用于后端和数据库的映射&#xff0c;即java对象转换成表&#xff09; mysql (关系型数据库) 顶层结构 .idea&#xff1a; idea缓存文件(不需要管) src&#xff1a;代码核心文件夹 —main&#xf…

进程间通信 之 共享内存

目录 什么是共享内存&#xff1f; 共享内存的系统调用接口 共享内存 进程间通信的本质及前提&#xff1a;让不同的进程看到同一份资源&#xff01; 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&a…

知识学习app

管理端&#xff1a; &#xff08;1&#xff09;登录 &#xff08;2&#xff09;首页数据报表&#xff1a;1.数据概括2.一周数据走势 &#xff08;3&#xff09;内容管理&#xff1a; 1.分类管理&#xff1a;新增&#xff0c;修改&#xff0c;删除&#xff0c;排序 2.八股文&…

基础监控理论

文章目录 监控流程架构体系监控分类 监控发展和技术企业中监控发展阶段通用技术和工具 监控流程架构体系 监控流程架构体系是确保信息系统健康、稳定运行的重要组成部分&#xff0c;它包括监控系统的设计、搭建、数据分析、数据采集、稳定性测试、自动化集成、部署上线以及图形…

LAMP 世界上使用最广泛的框架(安装LAMP框架)快照

说是框架就不只是一个东西。L:Linux&#xff0c;一种操作系统类型&#xff0c;专为服务器领域服务. A:Apache&#xff0c;web 服务器。 M:MySQL&#xff0c;数据库&#xff0c;存储项目的元数据&#xff0c;真实数据会存放在硬盘中。 P:PHP&#xff0c;一种编程语言&#xff0…

mongoDB7.0.6版安装与使用(最新版踩坑记录)

这里写自定义目录标题 0.前言1.MongoDB下载与安装2.启动服务及验证3.命令行访问4.navicat访问5.停止服务 0.前言 本文总结了最近版mongoDB下载安装的过程及简单的应用&#xff0c;整个过程不涉及修改配置文件&#xff0c;甚至不用设置用户名密码也不用登录认证&#xff0c;在进…

Knife4j的相关知识点!!

一、基础概念 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! Knif4j&#xff08;原名为 Swagger-Bootstrap-UI&#xff09;是一款基于 Swagger 实现的文档管理工具&am…

Linux命令之Tmux

1. Tmux是什么&#xff1f; Tmux是一个终端复用器&#xff08;terminal multiplexer&#xff09;&#xff0c;属于常用的开发工具&#xff0c;学会了之后可以大大的提高工作效率。 1.1 基本概念 在使用tmux之前我们先了解关于tmux的几个名词&#xff1a; session&#xff0c…

[Qt] 点击QTableWidget item项后键盘输入导致崩溃

复现场景 Qt版本 5.9.8 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);ui->tableWidget->setRowCount(1);ui->tableWidget->setColumnCount(2);Q…

【数据结构取经之路】栈

目录 引言 栈的性质 顺序栈 栈的基本操作 初始化 销毁 插入 删除 判空 取栈顶元素 栈的大小 完整代码&#xff1a; 引言 栈(stack)&#xff0c;可以用数组实现&#xff0c;也可以用链表实现。用数组实现的栈叫顺序栈&#xff0c;用链表实现的栈叫链式栈&#…

PriorityQueue集合源码分析

PriorityQueue集合源码分析 文章目录 PriorityQueue集合源码分析前置知识一、字段分析二、构造函数分析三、方法分析四、总结 PriorityQueue 优先级队列&#xff0c;是基于堆的结构来构建的。而堆是基于完全二叉树来实现的&#xff0c;而二叉树除了可以用节点来实现也可以用数组…

移动WEB开发之流式布局

一、移动端基础 1、浏览器 总结&#xff1a;兼容移动端主流浏览器&#xff0c;处理webkit内核浏览器即可。 2、移动端调试方法 Chrome devtools&#xff08;谷歌浏览器&#xff09;的模拟手机调试 搭建本地web服务器&#xff0c;手机和服务器一个区域网内&#xff0c;通过手机…

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

框架篇常见面试题

1、Spring框架的单例bean是线程安全的吗&#xff1f; 2、什么是AOP&#xff1f; 3、Spring的事务是如何实现的&#xff1f; 4、Spring事务失效的场景 5、SpringBean的声明周期 6、Spring的循环依赖 7、SpringMVC的执行流程 8、SpringBoot自动配置原理 9、Spring常见注解

解决MySQL “Lock wait timeout exceeded; try restarting transaction“ 错误

在处理MySQL数据库时&#xff0c;我们偶尔会遇到一个棘手的错误消息&#xff1a;“Lock wait timeout exceeded; try restarting transaction”。这通常表明我们的一个事务在尝试获取资源时被阻塞了太长时间。在并发环境中&#xff0c;多个事务同时竞争相同的资源可能会导致这种…

安卓手机切换国内IP地址的几种方法详解

随着互联网的普及和移动设备的广泛使用&#xff0c;IP地址已经成为了日常生活中不可或缺的一部分。IP地址不仅可以帮助大家在互联网上找到目标设备&#xff0c;还可以为网络安全提供一定的保障。然而&#xff0c;在某些情况下&#xff0c;可能需要切换国内IP地址&#xff0c;例…

SpringCloud Bus 消息总线

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第八篇&#xff0c;即介绍 Bus 消息总线。 二、概述 2.1 遗留的问题 在上一篇文章的最后&#xff0c;我…

源码部署LAMP架构

LAMP 文章目录 LAMP1. lamp简介2. web服务器工作流程2.1 cgi与fastcgi2.2 httpd与php结合的方式2.3 web工作流程 3. LAMP平台构建3.1 安装httpd3.2 安装mysql3.3 安装php3.4 验证 1. lamp简介 有了前面学习的知识的铺垫&#xff0c;今天可以来学习下第一个常用的web架构了。 …

腾讯云服务器按月收费价格表,优惠价格5元一个月起

2024腾讯云服务器多少钱一个月&#xff1f;5元1个月起&#xff0c;腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月&#xff0c;8核32G22M配置115元一个月、345元3个月&#xff0c;腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

● 647. 回文子串 1.dp数组含义。 之前的题目&#xff0c;差不多都是求什么就怎么定义dp数组&#xff0c;最后返回dp的最后一个元素。但是这里如果定义一维数组dp[i]是[0,i]范围的回文子串的个数的话&#xff0c;怎么根据dp[i-1]得到dp[i]&#xff1f;发现很难找到递归关系…