我一直在探索延迟数组的想法。如果我理解正确的话,它们只是像数组一样使用的函数。例如,在 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 中实现它,考虑到它没有被解释,所以它可能需要不断地重新编译访问器。可行吗?
最佳答案
如图所示,这无法在 C 中完成,但可以在 C++11 中使用 lambda 表达式完成。等效程序大致为:
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 示例。
关于javascript - 是否可以在 C 上实现延迟(非严格)数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21223697/