力扣 最大数组和-53

最大数组和-53

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        //Max用来找出最大子数组和,sum表示当前子数组的和,每次遍历不断累加子数组的和
        int Max = INT_MIN;
        int sum = 0;
        for(int i = 0; i < nums.size();i++)
        { 
            //循环累加子数组和
            sum += nums[i];
            //如果子数组和大于Max,更新Max
            if(sum>Max){
                Max = sum;
            }
            //如果子数组和小于零,继续累加的话没有意义,只会拖累后面的求解,所以将sum置为0
            if(sum<0){
                sum = 0;
            }
        }
        return Max;
    }
};

每日问题

什么是 C++ 中的类型别名和 using 声明?

在 C++ 中,类型别名和 using 声明 是两种用于定义和使用别名的方式,目的是简化复杂类型的使用,增强代码的可读性与可维护性。它们有一些相似之处,但也有一些细微的差别。

  1. 类型别名(typedef)

typedef 是 C++ 中定义类型别名的传统方法。通过 typedef,我们可以给现有的类型(如结构体、类、指针、数组等)起一个更简短或更易于理解的名字。

语法:

cpp 复制代码
typedef existing_type new_type_name;

示例:

cpp 复制代码
typedef int* IntPtr;  // 将 'int*' 类型定义为 'IntPtr',即 IntPtr 就是 'int*' 的别名
IntPtr ptr = nullptr; // 这相当于声明 'int* ptr'
cpp 复制代码
typedef int* IntPtr;  // 将 'int*' 类型定义为 'IntPtr',即 IntPtr 就是 'int*' 的别名
IntPtr ptr = nullptr; // 这相当于声明 'int* ptr'
  1. using 声明(C++11 引入)

using 是 C++11 引入的一种新的类型别名方式,它提供了一种更加直观、简洁的语法来定义类型别名。using 声明与 typedef 的功能相同,但语法上更加灵活,且支持模板类型的别名。

语法:

cpp 复制代码
using new_type_name = existing_type;

示例:

cpp 复制代码
using IntPtr = int*;  // 将 'int*' 类型定义为 'IntPtr'
IntPtr ptr = nullptr;  // 与 typedef 例子相同
cpp 复制代码
using ulong = unsigned long;  // 将 'unsigned long' 定义为 'ulong'
ulong x = 100;  // x 是 unsigned long 类型

typedef 与 using 的比较

语法:

using 声明的语法更直观,易读,尤其是在模板类型别名的定义上更清晰。

cpp 复制代码
typedef std::vector<int> IntVector;   // 使用 typedef 定义类型别名
using IntVector = std::vector<int>;   // 使用 using 定义类型别名(更简洁)

模板别名:

using 对模板类型别名有更好的支持,可以定义模板别名,typedef 则不支持直接定义模板别名。

cpp 复制代码
// 使用 typedef 定义模板类型别名
typedef std::vector<int> IntVector;
// 使用 using 定义模板类型别名(更简洁)
using IntVector = std::vector<int>;

模板类型别名(using 支持模板别名):

cpp 复制代码
// 定义一个模板类型别名
template <typename T>
using Ptr = T*;  // 定义一个模板别名,'Ptr<int>' 相当于 'int*'

Ptr<int> ptr = nullptr;  // ptr 是 'int*' 类型

兼容性:typedef 可以在旧版本的 C++ 中使用,而 using 声明从 C++11 开始引入。

总结:

typedef:是传统的类型别名声明方法。它适用于任何类型的别名定义,但其语法较为笨重,尤其在模板类型别名时显得不那么直观。

using:是 C++11 引入的新的类型别名声明方式,语法更简洁,支持模板类型别名,更加灵活和现代化。using 被广泛推荐用于 C++11 及以后版本的代码中。

这两者的功能是相同的,但是 using 声明提供了更清晰的语法,特别是在处理复杂的模板类型别名时。

如何使用类型别名和 using 声明?

如何使用类型别名 (typedef) 和 using 声明

在 C++ 中,类型别名和 using 声明都可以用来简化复杂类型的表示,使代码更加简洁易懂。下面分别介绍它们的使用方式和实例。

1. 使用 typedef 声明类型别名

typedef 用来为现有类型定义一个新的名称。通常我们用它来简化长类型名或者给类型起一个更有意义的别名。

语法:

cpp 复制代码
typedef existing_type new_type_name;

例子:

1.指针类型别名:

cpp 复制代码
typedef int* IntPtr;  // 'IntPtr' 是 'int*' 类型的别名
IntPtr ptr = nullptr;  // 等价于 'int* ptr = nullptr;'

2.数组类型别名:

cpp 复制代码
typedef int Array[10];  // 'Array' 是大小为 10 的整数数组的别名
Array arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

3.结构体类型别名:

cpp 复制代码
typedef struct {
    int x, y;
} 
Point;  // 'Point' 是结构体的别名
Point p = {1, 2};  // 创建结构体变量 p

4.更复杂的类型:

cpp 复制代码
typedef std::vector<int> IntVector;  // 'IntVector' 是 'std::vector<int>' 的别名
IntVector vec = {1, 2, 3};  // 使用 'IntVector' 创建一个整数向量

2. 使用 using 声明类型别名

C++11 引入了 using 声明来代替 typedef,语法更加简洁明了,特别是在模板类型别名方面。

语法:

cpp 复制代码
using new_type_name = existing_type;

例子:

1.指针类型别名:

cpp 复制代码
using IntPtr = int*;  // 'IntPtr' 是 'int*' 类型的别名
IntPtr ptr = nullptr;  // 等价于 'int* ptr = nullptr;'

2.数组类型别名:

cpp 复制代码
using Array = int[10];  // 'Array' 是大小为 10 的整数数组的别名
Array arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

3.结构体类型别名:

cpp 复制代码
using Point = struct {  // 'Point' 是一个结构体的别名
    int x, y;
};
Point p = {1, 2};  // 创建结构体变量 p

4.模板类型别名:using 最明显的优势是它在处理模板类型别名时的简洁性:

cpp 复制代码
using IntVector = std::vector<int>;  // 'IntVector' 是 'std::vector<int>' 的别名
IntVector vec = {1, 2, 3};  // 使用 'IntVector' 创建一个整数向量

另外,using 声明还可以用于模板类型别名:

cpp 复制代码
template <typename T>
using Ptr = T*;  // 定义模板类型别名 'Ptr<T>' 为 'T*'

Ptr<int> p = nullptr;  // 'p' 是 'int*' 类型
  1. typedef 与 using 的对比

优缺点:

1.语法简洁性:

using 语法更清晰、简洁,尤其在模板类型别名时更加直观。

typedef 在处理模板类型别名时较为繁琐。

2.模板类型别名:

using 允许直接为模板类型定义别名,而 typedef 需要使用更复杂的语法(特别是对于模板类别名)。

示例对比:

typedef 定义模板别名:

cpp 复制代码
typedef std::vector<int> IntVector;  // 定义类型别名 'IntVector' 为 'std::vector<int>'
IntVector vec = {1, 2, 3};

using 定义模板别名:

cpp 复制代码
using IntVector = std::vector<int>;  // 定义类型别名 'IntVector' 为 'std::vector<int>'
IntVector vec = {1, 2, 3};

对于模板类型别名,using 更加简洁和直观。

总结

typedef:传统的类型别名定义方式,适用于各种类型(包括基础类型、指针类型、数组类型、结构体等)。但是,在模板类型别名的处理上较为繁琐。

using:C++11 引入的类型别名声明方式,语法更简洁,特别是在模板类型别名时,using 是更加推荐的方式。它与 typedef 功能相同,但在现代 C++ 中更具优势。

对于现代 C++ 代码,通常推荐使用 using 来定义类型别名。

相关推荐
l1384942745120 分钟前
Java综合练习
java·开发语言·算法
z00061637 分钟前
C语言之函数的参数
c语言·数据结构·算法
St_Ludwig1 小时前
蓝桥杯疑似例题解答方案(打印任意阶杨辉三角)
c语言·c++·后端·算法·职场和发展·蓝桥杯
大白的编程日记.1 小时前
【C++笔记】数据结构进阶之二叉搜索树(BSTree)
开发语言·数据结构·c++·笔记
心.c1 小时前
0-1背包问题
c++·算法
kitesxian1 小时前
Leetcode146. LRU 缓存(HOT100)
数据结构·算法·leetcode·缓存
BigCowPeking2 小时前
leetcode 排序算法汇总
算法·leetcode·排序算法
熬夜学编程的小王2 小时前
【C++篇】从售票窗口到算法核心:C++队列模拟全解析
数据结构·c++·双端队列·队列·queue
eternal__day2 小时前
优选算法(双指针)
算法·leetcode·推荐算法
武昌库里写JAVA2 小时前
SpringBoot+SpringCloud面试题整理附答案
java·开发语言·算法·spring·log4j