力扣 最大数组和-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 来定义类型别名。

相关推荐
从以前3 分钟前
【算法题解】Bindian 山丘信号问题(E. Bindian Signaling)
开发语言·python·算法
不白兰7 分钟前
[代码随想录23回溯]回溯的组合问题+分割子串
算法
御风@户外1 小时前
质数生成函数、质数判断备份
算法·acm
Cosmoshhhyyy1 小时前
LeetCode:3083. 字符串及其反转中是否存在同一子字符串(哈希 Java)
java·leetcode·哈希算法
闻缺陷则喜何志丹1 小时前
【C++动态规划】1105. 填充书架|2104
c++·算法·动态规划·力扣·高度·最小·书架
Dong雨1 小时前
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
数据结构·算法·排序算法
达帮主1 小时前
7.C语言 宏(Macro) 宏定义,宏函数
linux·c语言·算法
是十一月末2 小时前
机器学习之KNN算法预测数据和数据可视化
人工智能·python·算法·机器学习·信息可视化
chenziang12 小时前
leetcode hot100 路径总和
算法
lyx1426062 小时前
leetcode 3083. 字符串及其反转中是否存在同一子字符串
算法·leetcode·职场和发展