我一直在探索延迟阵列的想法。如果我理解正确,它们只是像数组一样使用的函数。因此,例如,在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中实现它,考虑到它没有被解释,所以它可能需要不断重新编译访问器。它可行吗?
答案 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示例。