微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 std::begin 和 std::end 与具有运行时大小的数组一起使用

如何解决将 std::begin 和 std::end 与具有运行时大小的数组一起使用

对于编码测试,我有以下功能

static bool exists (int ints[],int size,int k)

目标是如果 truek 中,则返回 ints else return false

使用 std 库,可以做到这一点:

static bool exists (int ints[],int k) {
    return std::binary_search(std::begin(ints),std::end(ints),k);
}

但是,如果编译器知道大小,std::begin() 仅适用于 C 样式数组,从我已经能够收集到的。我不知道为什么会这样。

有没有办法在不编写自定义迭代器来处理它的情况下实现我想要的?有没有可能写出这样的迭代器?

改用 std::vector 不是一种选择,因为我无法更改函数定义。在调用 std::vector 之前将数组复制到 std::binary_search() 似乎也浪费 cpu 时间。

解决方法

您不能随意使用 std::begin()std::end(),因为正如 Andrieux 在评论中指出的那样,函数参数列表中的数组类型只是一个指针。函数的第二个参数是元素的数量这一事实证实了这一点。如果 std::end() 所需的信息存在于 ints[] 中,则不需要这样的参数。

然而,正如我在撰写本文时看到的前四个评论中的每一个所指出的那样,传入的指针是一个迭代器。事实上,普通指针具有随机访问迭代器的所有属性。

所以,是的,您不需要想出自己的迭代器类型。只需按照评论者的指示使用传入的指针即可。

static bool exists (int ints[],int size,int k) {
  return std::binary_search(ints,ints + size,k);
}

然而,只有当 std::binary_search() 的元素被排序以便 ints[] 可以工作时,调用 std::binary_search() 才是正确的做法。您没有在帖子中说明这一点。

至于是否可以编写您想要的迭代器,答案是肯定的,但这是不必要的,因为指针已经是输入到 std::binary_search() 的正确类型的迭代器。

您说得对,在正文中使用 std::vector 会浪费时间。

如果输入数组都是有序的,而函数的签名却是

template<int size> bool exists (int (&ints)[size],int k);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。