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

C++ 如何从向量中提取子向量?,c++,sorting,recursion,vector,C++,Sorting,Recursion,Vector,我正在编写递归解决方案,用于在旋转排序数组中查找最小元素。函数的输入是const vector,我必须得到一个子数组用于递归 findMin(const vector<int> &A) { int l=0,r=A.size()-1; if(r<l)return A[0]; if(r==l)return A[l]; int m=(l+r)/2; if((m<r)&&(A[m+1]<A[m]))

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

findMin(const vector<int> &A) {
    int l=0,r=A.size()-1;
    if(r<l)return A[0];
    if(r==l)return A[l];

    int m=(l+r)/2;
    if((m<r)&&(A[m+1]<A[m]))
        return A[m+1];
    if((m<r)&&(A[m]<A[m-1]))
        return A[m];
    if(A[m]<A[r]){
        const vector<int> &B(&A[0],&A[m-1]);
        return findMin(B);
    }
    const vector<int> &C(&A[m+1],&A[r]);
    return findMin(C);
}
findMin(常量向量&A){
int l=0,r=A.size()-1;

如果(r向量存储并拥有数据,则它们不是其中的视图。向量没有“子向量”,因为没有其他对象拥有向量的数据

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

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

更难的解决方案是编写一个
array\u view
类,该类存储两个
T*
,其行为与所需界面的范围类似,包括从向量隐式转换。将
const vector&B
和类似的
C
替换为正确编写的
array\u view B
,以及
a
nd(假设代码中没有其他错误)完成


是一个我写过的
数组视图。是一个正在被添加到
std
向量存储和拥有数据的视图。向量没有“子向量”,因为没有其他对象拥有向量的数据

const vector<int> &C(&A[m+1],&A[r]);
您可以将数据从一个向量复制到另一个向量,但将其称为“子向量”会产生误导

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

更难的解决方案是编写一个
array\u view
类,该类存储两个
T*
,其行为与所需界面的范围类似,包括从向量隐式转换。将
const vector&B
和类似的
C
替换为正确编写的
array\u view B
,以及
a
nd(假设代码中没有其他错误)完成

是一个我写过的
数组视图。是一个正在被添加到
std
常量向量&C(&A[m+1],&A[r])中的视图;
const vector<int> &C(&A[m+1],&A[r]);
这里出现的错误是,您试图绑定引用,但使用的是初始化向量的语法

获得子向量的正确方法是

const vector<int> C(&A[m+1],&A[r]);
常数向量C(&A[m+1],&A[r]);
请注意缺少的
&
。但是,这将生成给定范围的副本,这是不可取的

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

const vector&C(&a[m+1],&a[r]);
这里出现的错误是,您试图绑定引用,但使用的是初始化向量的语法

获得子向量的正确方法是

const vector<int> C(&A[m+1],&A[r]);
常数向量C(&A[m+1],&A[r]);
请注意缺少的
&
。但是,这将生成给定范围的副本,这是不可取的


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

对于此类递归函数,使用辅助函数更合适,如下所示:

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);
}
int findMinHelper(std::vector const&rotatedSorted,int left,int right)
{
if(right==left)返回rotatedSorted[左];
int mid=(右+左)/2;
if(mid左&&rotatedSorted[mid]rotatedSorted[中])
返回findMinHelper(旋转排序、左、中1);
返回findMinHelper(旋转排序,中间+1,右侧);
}
int findMin(标准::向量常量和旋转排序)
{
//rotatedSorted.empty()为true时正确处理大小写
//必须这样做
返回findMinHelper(rotatedSorted,0,rotatedSorted.size()-1);
}
然后,您可以拨打:

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

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

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);
}
int findMinHelper(std::vector const&rotatedSorted,int left,int right)
{
if(right==left)返回rotatedSorted[左];
int mid=(右+左)/2;
if(mid左&&rotatedSorted[mid]rotatedSorted[中])
返回findMinHelper(旋转排序、左、中1);
返回findMinHelper(旋转排序,中间+1,右侧);
}
int findMin(标准::向量常量和旋转排序)
{
//rotatedSorted.empty()为true时正确处理大小写
//必须这样做
返回findMinHelper(rotatedSorted,0,rotatedSorted.size()-1);
}
然后,您可以拨打:

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

std::无法获得实际的子数组将非常低效。最好将子数组的开始索引和结束索引作为参数传递。是的,我可以这样做。但这基本上是编码实践站点的一个问题。我所要做的就是完成给定的函数。我无法更改函数参数。完成了所有操作,卡在这一点上。如果在“现实世界”中,你有一些毫无意义的限制,请在你的问题中提及。在你的问题中包括一个到编码实践网站的链接,因为你很容易误解规则。获得一个实际的子数组将非常低效。最好通过