我有一个算法,我想翻译我的代码,而不是使用数组,我想使用矢量。
你怎么翻译这个:( 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]);
答案 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>
a
和int
数组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>
是一个存储一对指针(b
和e
)的类,并公开[]
和.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_t
和array_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);