我正在尝试用c ++学习矢量类。 为此,我试着从数组转换为矢量形式。
以数组格式
int find_recursively(int *a, int low, int high) {
int mid = (low+high)/2;
if(....)
return find_recursively(a,low,mid+1);
else if(...)
return find_recursively(a,mid+1,high);
}
我转换为矢量表单就是这样:
int find_recursively(vector<int> a) {
int low = 0;
int high = a.size() - 1;
int mid = (low + high) / 2;
if(....) {
vector<int> temp ( a.begin(), a.begin() + mid-2 );
return find_recursively(temp);
}
else if(...) {
vector<int> temp (a.begin()+mid+1, a.begin()+high);
return find_recursively(temp);
}
}
我测试了它,并直接关闭力。我认为问题在于边界,我没有在矢量中得到边界的逻辑。提前致谢
答案 0 :(得分:1)
vector支持索引运算符,因此不要使用矢量切片作为函数参数。传递对向量和索引的引用。与数组相同,但使用vector:
int find_recursively(const vector <int> &a, int low, int high)
您可以使用[index](例如[low])来访问您的值。但是如果“high”== a.size,尝试使用[high]会使你的SW崩溃。永远记得检查索引是否在向量内。
当你递归调用时,只需传递相同的'a':
find_recursively(a, low, mid+1);
例如。
答案 1 :(得分:1)
一旦你的递归向下钻到大小为2或更小的向量,你编写的代码就会出现问题。此时,您的“mid”值为1,并且第一个“if”块中的上限的“mid-2”计算产生-1。此外,您的函数会打开一个没有return语句的代码路径(如果两个“if”条件都评估为false)。
无论如何,你不应该像这样递归地克隆载体。您应该使用迭代器,如下所示:
template< class Iter >
int find_recursively(Iter low, Iter high) {
Iter mid = low + distance(low, high) / 2;
if (...some test of *mid...) {
return find_recursively(low, mid);
}
else if (...some other test of *mid...) {
return find_recursively(++ mid, high);
}
else {
return (something);
}
}
// call site:
find_recursively(my_vector.begin(), my_vector.end());
答案 2 :(得分:1)
.begin()
和.end()
是迭代器,它提供了一种简单地遍历容器的方法:
for(auto it = vec.begin(); it != vec.end(); ++vec)
cout << *it << " "; // print the contents of vec
请注意,end()
实际上不是容器的一部分。为什么这很重要?因为它可用于创建算法的更通用版本:
template <class ForwardIt>
int find_recursively(ForwardIt first, ForwardIt last) {
const size_t length = std::distance(first,last);
if(length == 0) {
/* do something accordinlgy */
} else if (length == 1) {
/* do something accordingly */
}
auto mid = first;
std::advance(mid,length/2);
if(....) {
return find_recursively(first, mid);
}
else if(...) {
return find_recursively(mid, first);
}
}
/* example calls: */
std::vector<int> vec = {....};
int result1 = find_recursively(vec.begin(), vec.end());
int array[] = {....};
int result2 = find_recursively(std::begin(array), std::end(array));