是否有一种方法来使用数组作为std::begin或std::end的参数?



如果我使用一个数组作为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的类型已被调整为指向intint*的指针,并且您不能将指针传递到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;
}

最新更新