最大数组和-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 声明 是两种用于定义和使用别名的方式,目的是简化复杂类型的使用,增强代码的可读性与可维护性。它们有一些相似之处,但也有一些细微的差别。
- 类型别名(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'
- 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*' 类型
- 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 来定义类型别名。