是否可以在C上实现延迟(非严格)数组?

时间:2014-01-19 22:48:02

标签: javascript c++ c arrays

我一直在探索延迟阵列的想法。如果我理解正确,它们只是像数组一样使用的函数。因此,例如,在JavaScript中:

// Brief implementation:
array = function(values){
    return function(i){
        if (i>=0 && i<values.length)
            return values[i];
        else
            throw "Out of bound";
    }
};
set = function(array,index,val){
    return function(i){
        return i === index ? val : array(i);
    }
};

// Using:
my_array = array([10,20,30,40]);
assert(my_array(0) === 10);
assert(my_array(1) === 20);
new_array = set(my_array,0,100);
assert(new_array(0) === 100);

这样做的好处是,您可以影响O(1)中的每个元素而不是O(N),这是因为必须定期分摊它。我不知道如何在C中实现它,考虑到它没有被解释,所以它可能需要不断重新编译访问器。它可行吗?

1 个答案:

答案 0 :(得分:0)

如图所示,这不能在C中完成,但可以使用lambda表达式在C ++ 11中完成。等效的程序大致是:

template <typename T>
auto array(const std::initializer_list <T> values)
{
    return [&](size_t i) { return *(values.begin() + i); };
}

template <typename A, typename T>
auto set(A&& array, size_t index, const T& val)
{
    return [&](size_t i) { return i == index ? val : array(i); };
}

int main ()
{
    auto my_array = array({10,20,30,40});
    assert(my_array(0) == 10);
    assert(my_array(1) == 20);
    auto new_array = set(my_array, 0, 100);
    assert(new_array(0) == 100);
}

我没有添加边界检查,这在lambda中是不可能的,但是可以通过额外的函数调用来实现。同样可以在C ++ 03中使用自定义模板函数对象来完成,但需要更多代码。

我不是在评论这种方法的有用性或效率,我只是展示了一种可能的方法,使其类似于给定的Javascript示例。