C++ 如何从向量中提取子向量?
我正在编写递归解决方案,用于在旋转排序数组中查找最小元素。函数的输入是const vector,我必须得到一个子数组用于递归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]))
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::无法获得实际的子数组将非常低效。最好将子数组的开始索引和结束索引作为参数传递。是的,我可以这样做。但这基本上是编码实践站点的一个问题。我所要做的就是完成给定的函数。我无法更改函数参数。完成了所有操作,卡在这一点上。如果在“现实世界”中,你有一些毫无意义的限制,请在你的问题中提及。在你的问题中包括一个到编码实践网站的链接,因为你很容易误解规则。获得一个实际的子数组将非常低效。最好通过