如果我使用一个数组作为std::begin或std::end方法的参数,例如:
,我一直得到编译错误:#include <iostream>
#include <algorithm>
using namespace std;
class Test
{
public:
static bool exists(int ints[], int size, int k)
{
if (std::find(std::begin(ints), std::end(ints), k) != std::end(ints)) {
return true;
}
return false;
}
};
我尝试将其转换为∫0],但它仍然无法编译。
参数ints
不是数组,因此在示例中您没有将数组传递给std::begin
/std::end
。在c++中,函数形参从来不是数组。当您将函数数组声明为数组时,例如在您的示例中,该参数被调整为指向该数组元素的指针。在您的情况下,参数ints
的类型已被调整为指向int
即int*
的指针,并且您不能将指针传递到std::begin
/std::end
,因为错误消息肯定会解释。
您已经传递了size
作为另一个参数,因此您可以使用:
std::find(ints, ints + size, k)
更现代的API设计是将指针和大小包装到一个类中。c++ 20标准库附带了这样的类模板:std::span
。它也有方便的范围算法,非常方便:
static bool exists(std::span<const int> ints, int k)
{
if (std::ranges::find(ints, k) != std::end(ints)) {
更重要的是,c++ 20标准库有一个函数模板,使你的函数变得不必要:
std::ranges::contains(some_array, k);
使用std::span
试试这个:
#include <algorithm>
#include <iostream>
#include <span>
bool exists(std::span<int> span, int needle) {
return std::find(span.begin(), span.end(), needle) != span.end();
}
int main() {
int arr[] = {0, 1, 2, 3, 4};
bool ok = exists(arr, 3);
if (ok) {
std::cout << "ok" << 'n';
} else {
std::cout << "not ok" << 'n';
}
return 0;
}
下面是一个工作示例。
#include <iostream>
#include <vector>
bool exists(int x[], const int size, const int k)
{
std::vector<int> v(x, x + size);
if (std::find( v.begin(), v.end(), k) != v.end()) {
return true;
}
return false;
}
int main()
{
int const sz = 10;
int arrayi[sz] = { 1, 2, 3,4 ,5 ,6 ,7 , 8, 9, 0 };
if (exists(arrayi, sz, 4))
std::cout << "exist" << std::endl;
else
std::cout << "it does not" << std::endl;
}