假设我有一个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
(。该库包含大量用于处理新的数组类型结构的函数:vec
、dict
、keyset
。HSL库中的这些函数以C
、Vec
、Dict
、Keyset
为前缀,您会发现Math
、Str
等对其他需求非常有用。
安装该包后,它就可用了,但通常添加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>