2016-12-24 56 views
-2

我刚刚完成了关于LeetCode的一个问题,看看这行:int visited[nums.size()] = {0};,显然这是错误的,因为你不能静态地初始化一个数组而不指定它的大小,但不知怎的,它在LeetCode上工作,我甚至提交了它。任何人都可以解释这里发生了什么?LeetCode会忽略C++中的某些语义错误吗?

class Solution { 
public: 
vector<vector<int>> permuteUnique(vector<int>& nums) { 
    vector<vector<int>> result; 
    result.clear(); 
    vector<int> v; 
    v.clear(); 

    sort(nums.begin(), nums.end()); 
    int visited[nums.size()] = {0}; 

    helper(result, v, visited, nums);  
    return result; 
} 

void helper(vector<vector<int>> &result, vector<int> &v, int visited[], vector<int>& nums) { 
    if (v.size() == nums.size()) { 
     result.push_back(v); 
     return; 
    } 

    for (int i = 0; i < nums.size(); i++) { 
     if (visited[i] == 1) { 
      continue; 
     } 

     if (i > 0 && nums[i] == nums[i - 1] && visited[i - 1] == 0) { 
      continue; 
     } 

     visited[i] = 1; 
     v.push_back(nums[i]); 
     helper(result, v, visited, nums); 
     v.pop_back(); 
     visited[i] = 0; 
    } 
} 
}; 
+1

忘掉变长数组(不是标准的),而是使用'std :: vector'。 VLA比他们的价值更麻烦,IMO。如果元素数量很大,他们可以吹出堆栈,但不容易检查边界条件(使用vector,你有'at()')函数,最后,VLA不是标准的,而vector是标准。 – PaulMcKenzie

+0

任何人都可以告诉我为什么我的问题得到了投票?这是我把第一个问题放在了stackoverflow上,我不确定我是否做错了什么。 – myyukiho

回答

1

leetcode使用g ++ 5.4.0编译器进行C++编译。它支持可变长度的数组定义。在ISO C99规范之后,允许使用可变长度声明的数组。 [Examples and Related Info]

+0

当我将上面的代码复制到Xcode时,它显示错误。你的意思是我的编译器不支持它,但是leetcode支持它吗? – myyukiho

+0

Xcode使用LLVM编译器。它也应该支持可变长度的数组定义。但它通过扩展启用。你可以检查它是否被Werror = vla禁用? http://clang.llvm.org/compatibility.html#vla –

+0

@GahitGungor,我不知道我是否完全按照你所说的,错误是**错误:使用了可变长度数组[-Werror,-Wvla] **和**错误:可变大小的对象可能未被初始化** – myyukiho

1

显然,线int visited[nums.size()] = {0};错了,虽然它不是标准的C++。

这叫做variable length array简称VLA)。这个编译器扩展允许数组的长度为而不是是一个常量表达式,就像在你的例子中一样。

+0

谢谢。它有助于。 – myyukiho