如何从向量中提取子向量?

时间:2015-08-09 14:57:09

标签: c++ sorting recursion vector

我正在编写用于在旋转的排序数组中查找最小元素的递归解决方案。函数的输入是const向量,我必须获得递归的子数组。

var itemHeight = $('.item').height();
$('.item').each(function() {
  $(this).css({
    height: itemHeight + 'px'
  });
});

$(window).on('resize', function(event) {

  $('.item').each(function() {
    $(this).css({
      height: itemHeight + 'px'
    });
  });
});

错误是关于子矢量B和C

3 个答案:

答案 0 :(得分:2)

向量存储和拥有数据,它们不是对它的视图。向量没有“子向量”,因为没有其他对象拥有向量的数据。

您可以将数据从向量复制到另一个向量,但调用“子向量”会产生误导。

最简单的解决方案是重写函数以使用迭代器开始和结束而不是容器。您可以使用现有的接口,并让它调用双迭代器版本来维护API。

更难的解决方案是编写一个存储两个array_view<T>的{​​{1}}类,其行为类似于您想要的接口范围,包括隐式的矢量转换。使用正确编写的T*以及const vector<int>&B替换您的C和类似array_view<int const> B,并且(假设您的代码中没有其他错误)您已完成。

here是我写的Ahere是正在添加到array_view的过程中的一个。

答案 1 :(得分:2)

const vector<int> &C(&A[m+1],&A[r]);

您在此处遇到的错误是您尝试绑定引用,但您正在使用语法初始化向量。

获取子矢量的正确方法是

const vector<int> C(&A[m+1],&A[r]);

注意缺少的&。然而,这将是给定范围的副本,这是不合需要的。

正如上面的评论中所建议的那样,将函数参数更改为向量和几个索引,或者(或许更好)将其作为几个迭代器。

答案 2 :(得分:0)

对于这种类型的递归函数,使用辅助函数会更合适,如下所示:

int findMinHelper(std::vector<int> const& rotatedSorted, int left, int right)
{
    if (right == left) return rotatedSorted[left];

    int mid = (right + left) / 2;

    if (mid < right && rotatedSorted[mid + 1] < rotatedSorted[mid])
       return rotatedSorted[mid + 1];

    if (mid > left && rotatedSorted[mid] < rotatedSorted[mid - 1])
       return rotatedSorted[mid];

    if (rotatedSorted[right] > rotatedSorted[mid])
       return findMinHelper(rotatedSorted, left, mid - 1);

    return findMinHelper(rotatedSorted, mid + 1, right);
}

int findMin(std::vector<int> const& rotatedSorted)
{
    // proper handling of the case when rotatedSorted.empty() is true 
    // must be done
    return findMinHelper(rotatedSorted, 0, rotatedSorted.size() - 1);
}

然后,您可以致电:

std::vector<int> input{10, 21, 4, 5, 8};
int minValue = findMin(input);
std::cout << minValue << std::endl;

将按预期打印4。