从数组转换为向量的边框

时间:2013-03-07 20:25:40

标签: c++ arrays stdvector

我正在尝试用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);
    }
}

我测试了它,并直接关闭力。我认为问题在于边界,我没有在矢量中得到边界的逻辑。提前致谢

3 个答案:

答案 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));