用于检查vec是否包含指定元素的内置



假设我有一个vec<int>,其中包含一个可能不连续的整数列表(由于元素已从数据库中删除(。

示例:

$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];

现在我需要检查这个vec是否包含给定的数字,如果是,将其增加1并重复检查。

$newItemNumber = count($occupiedNumbers);
while (/* check if $occupiedNumbers contains $newItemNumber */) {
$a++;
}

在普通PHP中有in_array(),但这对vec有效吗?此外,还有一个内置的HHVector::linearSearch(),但它旨在与vec的前代HHVector一起使用。

检查vec是否包含给定值的正确解决方案是什么?

HHVM和Hack文档都没有提到vec的用例。此外,我还缺少一些REPL工具来手动检查项目,而不构建一个完整的(可能有缺陷的(项目。

HHVM/HackLang人员建议您使用Ccontains(),正如您在此处阅读的那样,但您需要使用composer安装HSL包(hhvm/hsl(。该库包含大量用于处理新的数组类型结构的函数:vecdictkeyset。HSL库中的这些函数以CVecDictKeyset为前缀,您会发现MathStr等对其他需求非常有用。

安装该包后,它就可用了,但通常添加use namespace更方便,以避免长前缀:

use namespace HHLibC;

这就是你可以做到的:

$exists = Ccontains($occupiedNumbers, $newItemNumber);

如果您真的在寻找从count($occupiedNumbers)开始的最长连续间隔,那么在排序列表中找到其初始索引(如果存在(可能会快得多,然后从那里使用直接索引:

// `use namespace HHLib{C, Vec};` at top level
$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];
$sorted = Vecsort($occupiedNumbers); // if not sorted in general
$size = count($sorted);
$v = $size;
$i = Cfind_key($sorted, $w ==> $w === $v);
if($i !== null) {
for(; $i < $size - 1 && $sorted[$i + 1] === $v + 1; $i++, $v++) {
}
}
// $i is null | <index of largest number in continuous interval>

相关内容

最新更新