如何在cpp中使用静态关键字



如果我错了,请纠正我,我知道当我们想使变量仅初始化一次时使用static关键字。我以前从来没有用过static。虽然我今天解决了一个问题,你必须在给定范围内的BST中添加数字。我想尝试静态关键字,因为我最近了解了它,所以这是我的代码:'

class Solution {
public:
int rangeSumBST(TreeNode* root, int low, int high) {
static int sum=0;
if(root==NULL)return sum;
if(root->val>=low && root->val<=high)sum+=root->val;
if(root->left)rangeSumBST(root->left,low,high);
if(root->right)rangeSumBST(root->right,low,high);
return sum;
}
};

root = [10,5,15,3,7,null,18], low = 7, high = 15

,其中答案是32。

但是对于下一个测试用例:
root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10

答案应该是23,但它显示55。我试着看看添加了什么数字:

if(root->val>=low && root->val<=high)sum+=root->val;cout<<root->val;

给出的输出为:10,7,6,加起来应该是23,但它给出的是55。

我的最终解决方案是(没有静态):'

class Solution {
public:
int sum=0;
int rangeSumBST(TreeNode* root, int low, int high) {
if(root==NULL)return sum;
if(root->val>=low && root->val<=high)sum+=root->val;
if(root->left)rangeSumBST(root->left,low,high);
if(root->right)rangeSumBST(root->right,low,high);
return sum;
}
};

如何使用静态关键字?

递归之所以有效,是因为每次调用时都会创建一个函数上下文。从这个意义上说,静态是一种反递归。所以我很难理解静态主要用于递归的说法。在我的经验中,它很少这样使用,你的例子是一个很好的例子。

这是你的代码重写,以便它的工作,sum是一个局部变量,不是静态的,不是成员的,不是全局的。

class Solution {
public:
int rangeSumBST(TreeNode* root, int low, int high) {
if (root == NULL)
return 0;
int sum = 0; // NOT static
if (root->val >= low && root->val <= high)
sum += root->val;
sum += rangeSumBST(root->left, low, high);
sum += rangeSumBST(root->right, low, high);
return sum;
}
};
重要的区别在于I使用递归调用的返回值,而不是试图通过一些静态、成员或全局变量返回值。这样,每个递归调用都是相互独立的,这是应该的。

Static通常用于单例,保存到此。

您对静态的理解存在严重缺陷。它不是只初始化一次,虽然我认为您可能会在递归中使用它,但我从未使用过。

静态变量意味着只有一个副本,并且它是持久的。如果你的程序现在进入该方法,然后在一小时后再次进入该方法,它将拥有上次运行结束时的值。

此外,如果你有一个多线程程序,仍然只有一个副本,两个线程都在使用它。

即使你有10个解决方案对象,也会有一个单一的和值。

因此,static很少使用。我唯一一次使用它是在Singleton模式中,它对您来说是高级的,但被认为是有争议的。

因此,虽然了解它很重要,但在您的编程水平上,您可能不会使用它。最好使用类中的字段,而不是方法中的静态变量。

当你开始多线程编程时,它们将开始潜入你的代码中,而你可能根本就没有。

最新更新