混乱

2017-05-30 17 views
0

だからどこかに投稿コードを通過した混乱

public: 
    TreeNode* sortedArrayToBST(vector<int>& nums) { 
     if(nums.size() == 0) return NULL; 
    int mid=nums.size()/2; 

     TreeNode* root = new TreeNode(nums[mid]); 
    auto it=nums.begin()+1; 
    cout<<*it; 

    vector<int> left(nums.begin(),nums.begin()+mid); 
    vector<int> right(nums.begin()+mid+1,nums.end()); 
    root->left=sortedArrayToBST(left); 
    root->right=sortedArrayToBST(right); 

    return root; 
    } 

LETサンプル入力される[1,2,3,4]だから、プリントとして

iterator itそれは私に答えを与える3

しかし、サブアレイを作成する際に、サブアレイは要素[1,2]から作成されます。私はここで混乱します。nums.begin()+ middleが要素3を指すように、サブ配列を[1,2,3]にしてはいけませんか?私は誰かがC++が正常に結果に含まれるイテレータのポイントを「開始」で最初の項目が、「エンドシステムを使用しています。この おかげ

+2

あなたの質問には直接関係しませんが、このコードは実行時リソースの大量な浪費です。各ステップで2つの新しいコピーを作成するのではなく、元のベクターにビューを使用する必要があります –

答えて

2

をクリアすることができ、私は非常に基本的で素朴な疑問を持っていると思います"イテレータポイント1つ前の結果結果に含まれる最後の項目。

は今、もう一つの小さな問題があります:あなた本当には、むしろそれをコピーするよりも、既存のデータへのベクトルのようなアクセスを与えること、(別名array_view、別名spanvector_viewのようなものを使用したい - それは、あるとして本当に必要なものよりもかなり遅いでしょう)。使用可能なものがない場合は、独自のものを実装するか、ポインタ/イテレータと長さを渡すだけです。

1

2つのイテレータ引数、firstlast、コピー範囲内のすべての要素が最大firstから出発しかしlast含まないかかりvector constructorは。 vector<t>::end()が配列の終端を越えて素子1を参照して、実際に逆参照することができないので、イテレータ範囲は一般[first, last)lastを除く)として指定されている -

vector<T>::begin()vector<t>::end()このコンストラクタに渡された場合について考えてみよう[first, last]lastを含む)ではなく