2017-05-30 141 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; 
    } 

令样品输入是[1,2,3,4]

因此,正如我打印迭代器它,它给我的答案如下3

此外,然而,当创建子数组时,创建的子数组由元素[1,2]组成。我在这里感到困惑,因为nums.begin()+ middle将指向元素3,子数组不应该[1,2,3]?我想我有一个非常基本的和幼稚的疑问,有人能清除这个 感谢

+2

与你的问题没有直接关系,但是这段代码大量浪费了运行时资源 - 它应该在原始向量上使用视图,而不是在每一步创建两个新副本 –

回答

2

C++通常使用一个系统,其中的“开始”迭代点的第一个项目被列入的结果,但“结束“迭代器指向一个过去的要包含在结果中的最后一个项目。

现在有一个更小问题:你真的要使用像一个vector_view(又名array_view,又名span),给人以现有的数据,而不是复制它矢量般的访问 - 这是,它会比实际需要慢得多)。如果你没有可用的,你可以实现你自己的一个,或者只传递一个指针/迭代器和一个长度。

1

vector constructor接受两个迭代器参数,firstlast,拷贝范围内的所有元素从first启动,但不包括last

想一想当vector<T>::begin()vector<t>::end()被传递给此构造的情况下 - vector<t>::end()指元件一个过去的数组的末尾,并且实际上不能解除引用,因此迭代范围通常指定为[first, last)(不含last)而不是[first, last](包括last)。