保护循环的数组索引?它实际上在检查什么?

时间:2019-07-02 09:40:32

标签: c loops hash hashmap boolean

这些是C代码的一些部分,用于使用开放地址来实现哈希图。我不明白insert函数中的while循环正在检查什么,twoSum函数中的if语句正在检查什么。

是否执行while循环条件检查该值是否在数组中或该值不为null。 if语句是否检查值是否不为0?我不明白

我一直认为这样的事情就像需要手动中断的while(1)循环一样工作。

我想知道我理解主体的条件是该循环警戒声明的条件。

void insert(int *keys, int *values, int key, int value) {
    int index = hash(key);
    while (values[index]) { // What does this check for?
        index = (index + 1) % SIZE;
    }
    keys[index] = key;
    values[index] = value;
}
int* twoSum(int* nums, int numsSize, int target) {
    int keys[SIZE];
    int values[SIZE] = {0};
    for (int i = 0; i < numsSize; i++) {
        int complements = target - nums[i];
        int value = search(keys, values, complements);
        if (value) { // What does this line check for?
            int *indices = (int *) malloc(sizeof(int) * 2);
            indices[0] = value - 1;
            indices[1] = i;
            return indices;
        }
        insert(keys, values, nums[i], i + 1);
    }
    return NULL;
}

1 个答案:

答案 0 :(得分:0)

我们只能猜测。

看起来像 import React from 'react'; import { makeStyles } from '@material-ui/styles'; import Button from '@material-ui/core/Button'; const useStyles = makeStyles({ root: { background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)', border: 0, borderRadius: 3, boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)', color: 'white', height: 48, padding: '0 30px', }, }); export default function Hook() { const classes = useStyles(); return <Button className={classes.root}>Hook</Button>; } 期望指向始终具有最终值为零的最终元素的数组的指针,该函数的设计者已选择该约定来表示“数组的末尾”

看起来像 insert在搜索失败时返回零。

但是,任何一个都可能是一个错误(我很怀疑,因为此设计禁止将零视为“真实” /有效值),而且两者都是不好的设计-在前一种情况下,为什么不通过数组大小作为参数吗?在后一种情况下,为什么不像其他C API一样返回search并将结果(如果成功)作为“输出参数”给出呢?

最终,我们无法神奇地知道函数的先决条件,因此您将不得不询问编写该函数的人。

这就是为什么代码应该带有解释性注释的原因。