从数组到向量转换的边界

borders in converting from array to vector

本文关键字:边界 转换 向量 数组      更新时间:2023-10-16

我正在尝试学习c++中的向量类。要做到这一点,我正试图从数组转换为向量形式。

in array form

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);
    }
}

我测试了它,并给出了直接接近力。我认为问题在于边界,我不明白向量边界的逻辑。提前感谢

vector支持索引操作符,所以不要使用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);
例如

您编写的代码,一旦递归深入到大小为2或更小的向量,就会出现问题。在这一点上,你的"mid"值是1,而在你的第一个"if"块中对一个上限的"mid-2"计算产生-1。此外,你的函数会打开一个没有返回语句的代码路径(如果两个"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());

.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));