等价于c ++中vector上的int [] + k

时间:2015-10-05 19:09:00

标签: c++ arrays pointers vector array-view

我有一个算法,我想翻译我的代码,而不是使用数组,我想使用矢量。

你怎么翻译这个:( 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 个答案:

答案 0 :(得分:5)

使用功能模板:

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

通过使用两种类型的迭代器,可以使它更通用。

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

这使您可以灵活地使用std::vector<int> aint数组b,反之亦然。

答案 1 :(得分: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_type,而不是int

答案 2 :(得分:2)

vector<int> const&int size替换为array_view<const int>

array_view<T>是一个存储一对指针(be)的类,并公开[].size()以及{{1} }和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*的隐式构造函数。< / p>

T*, size_tarray_view<T> without_front(size_t=1)等方法也很有用。

有一个array_view<T> without_back(size_t=1)也支持多维数组,或者你可以自己滚动。 Here is one I posted on stack overflow,它解决了另一个问题。它没有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}。如果你想传递一个向量,它会隐式转换。

答案 3 :(得分:0)

只需将vector<int>翻译成数组,例如:

vector<int> v;
vector<int> w;
// ...
find_kth(&v[0], &w[0] + j, i, w.size() - j, k - j);