0

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

私はそれをテストし、力を直接与えます。問題は境界線にあると思います。ベクトルの境界線のロジックがわかりません。前もって感謝します

4

3 に答える 3

1

ベクトルはインデックス演算子をサポートしているため、ベクトルのスライスを関数パラメーターとして使用しないでください。ベクトルとインデックスへの参照を渡します。配列の場合と同じですが、ベクトルの場合:

int find_recursively(const vector <int> &a, int low, int high)

また、a[index] (a[low] など) を使用して値にアクセスできます。ただし、"high" == a.size の場合、a[high] を使用しようとすると SW がクラッシュします。インデックスがベクトル内にあることを常に確認してください。

再帰的に呼び出すときは、同じ 'a' を渡すだけです。

find_recursively(a, low, mid+1);

例えば。

于 2013-03-07T20:46:21.227 に答える
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));
于 2013-03-07T20:58:51.480 に答える