2016-12-24 9 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よりも厄介です。要素の数が多い場合はスタックを吹き飛ばすことができます。境界条件(ベクトルで、at())関数を簡単にチェックすることはできません。最後に、VLAは標準ではなく、vectorは標準。 – PaulMcKenzie

+0

誰も私の質問がダウン投票された理由を教えてもらえますか?それは私がstackoverflowに置いた私の最初の質問ですが、私は何かが間違っていたかどうかはわかりません。 – myyukiho

答えて

1

leetcodeは、C++コンパイルにg ++ 5.4.0コンパイラを使用しています。可変長配列定義をサポートしています。 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

それは標準C++ではないのですが、どうやら、ラインint visited[nums.size()] = {0};は、間違っていないです。

これは、variable length array(略してVLA)と呼ばれています。このコンパイラ拡張では、配列の長さはでなく、という定数式になります。

+0

ありがとうございます。助けになる。 – myyukiho

関連する問題