从向量主数组创建子数组的困惑

时间:2017-05-30 04:00:14

标签: c++ arrays vector iterator

所以我在某处发布了一个贴出的代码:

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]组成。我在这里感到困惑,不应该将子数组设为[1,2,3],因为nums.begin()+ middle会指向元素3吗?我想我有一个非常基本和天真的怀疑,有人可以清楚这一点 谢谢

2 个答案:

答案 0 :(得分:2)

C ++通常使用一个系统,其中&#34;开始&#34;迭代器指向 要包含在结果中的第一个项目,但是&#34; end&#34;迭代器指向过去要包含在结果中的最后一项。

现在还有一个小问题:你真的想要使用像vector_view(又名array_view,又名span)这样的东西,它提供了对现有数据的类似矢量的访问,而不是复制它 - 因为它会比任何真正的需要慢得多)。如果你没有那个,你可以实现自己的一个,或者只传递一个指针/迭代器和一个长度。

答案 1 :(得分:1)

带有两个迭代器参数firstlast的{​​{3}}复制从first开始但不包括last的范围内的所有元素}。

考虑将vector<T>::begin()vector<t>::end()传递给此构造函数的情况 - vector<t>::end()引用一个超出数组末尾的元素,并且实际上不能解除引用,因此迭代器范围通常指定为[first, last)(不包括last),而不是[first, last](包括last)。