【发布时间】:2021-07-30 17:58:30
【问题描述】:
对于编码测试,我有以下功能:
static bool exists (int ints[], int size, int k)
如果k 在ints 中,则目标是返回true,否则返回false。
使用标准库,可以做到这一点:
static bool exists (int ints[], int size, int k) {
return std::binary_search(std::begin(ints), std::end(ints), k);
}
但是,std::begin() 仅适用于 C 样式的数组,前提是编译器知道大小,从我收集到的内容。不过我不知道为什么会这样。
有没有办法在不编写自定义迭代器来处理它的情况下实现我想要的?有可能写出这样的迭代器吗?
使用std::vector 不是一个选项,因为我无法更改函数定义。在调用std::binary_search() 之前将数组复制到std::vector 似乎也是在浪费CPU 时间。
【问题讨论】:
-
你必须使用
std::begin和std::end吗?您可以使用std::binary_search(ints, ints + size, k);获得此效果。或者std::array/std::vector。 -
哇,我没想到你可以做 std::binary_search(ints, ints + size, k);感谢您的回答。
-
在
std::begin和std::end存在之前,我们就是这样做的。 -
数组类型函数参数是继承自C的一个大谎言。它们实际上只是指向第一个元素的指针。这是指针和数组之间经常混淆的原因之一。正如您所注意到的,
std::begin和std::end不适用于指针。但是指针是一种有效的迭代器,因此您可以使用指针而不是std::begin和std::end,只要这些指针引用连续范围的元素即可。所以你可以使用ints作为begin迭代器和ints + size作为end迭代器。