3

アルゴリズムがあり、コードを変換したいので、配列を使用する代わりにベクトルを使用したいと考えています。

これをどのように翻訳しますか: (b + j と a の側)

find_kth(a, b + j, i, size_b - j, k - j);

どこ

int find_kth(int a[], int b[], int size_a, int size_b, int k);

の中へ

int find_kth(const vector<int>& a, const vector<int>& b, int size_a, int size_b, int k);

同等である必要があるため、このような呼び出しは、配列を使用しているかのように同じ値を返します。

min(a[0], b[0]);
4

4 に答える 4

5

関数テンプレートを使用します。

template <typename Iterator>
int find_kth(Iterator a, Iterator b, int size_a, int size_b, int k)
{
  ...
}

2 種類の反復子を使用して、より一般的なものにすることができます。

template <typename IteratorA, typename IteratorB>
int find_kth(IteratorA a, IteratorB b, int size_a, int size_b, int k)
{
  ...
}

std::vector<int>これにより、 forとforaの配列を柔軟に使用でき、その逆も可能です。intb

于 2015-10-05T19:13:41.837 に答える
5

標準的な方法は、代わりに反復子の範囲を使用することです。

template <typename Iterator>
int find_kth(
    Iterator a_begin,
    Iterator a_end,
    Iterator b_begin,
    Iterator b_end,
    int k);

ベクトルのセクションのみを操作する必要があるため、これは便利です。このアプローチでは、ベクトルを分割する必要はありません。

SergeyA のコメントに基づいて改善された署名:

template <typename T>
using is_fwd_it = std::is_base_of<
    std::forward_iterator_tag,
    typename std::iterator_traits<T>::iterator_category>;

template <typename A_It, typename B_It,
    typename = typename std::enable_if<
        is_fwd_it<A_It>::value && is_fwd_it<B_It>::value>::type>
int find_kth(
    A_It a_begin,
    A_It a_end,
    B_It b_begin,
    B_It b_end,
    int k);

別のテンプレート パラメータを追加するか、 を使用して の代わりに をstd::iterator_traits取得することもできます。value_typeint

于 2015-10-05T19:14:15.100 に答える
2

vector<int> const&int sizeを に置き換えarray_view<const int>ます。

Anarray_view<T>は、一対のポインター ( band ) を格納し、 and およびand and and andをe公開するクラスです。、、、、および および からの暗黙のコンストラクターがあります。[].size()begin()end()front()back()empty()std::vector<T>&std::vector<remove_const_T> const&T(&)[N]std::array<T,N>&std::array<remove_const_T,N>const&T*, T*T*, size_t

array_view<T> without_front(size_t=1)やのようなメソッドarray_view<T> without_back(size_t=1)も便利です。

std::experimental::array_view多次元配列もサポートする があります。または、独自の配列を作成することもできます。これは私がスタックオーバーフローに投稿したもので、別の問題を解決します。はありませんがwithout_front、それは簡単に記述できます (どれだけ安全にしたいかによって異なります。完全に安全で、不正な形式の配列ビューを返すことを拒否し、代わりに空のものを返すためです。小切手は安いです)。

使い方は次のようになります:

int find_kth(array_view<int const> a, array_view<int const> b, int k){
  // ...
  find_kth(a, b.without_front(j), k-j);
  // ...
}

私は滑らかだと思います。生の配列を渡したい場合は、{arr, size}単にarray_view. ベクトルを渡したい場合は、暗黙的に変換されます。

于 2015-10-05T19:15:36.697 に答える
0

vector<int>を次のような配列に変換するだけです。

vector<int> v;
vector<int> w;
// ...
find_kth(&v[0], &w[0] + j, i, w.size() - j, k - j);
于 2015-10-05T19:14:21.550 に答える