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

标签 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 中实现它,考虑到它没有被解释,所以它可能需要不断地重新编译访问器。可行吗?

最佳答案

如图所示,这无法在 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/

相关文章:

java - 在 Java 中处理法语字符

javascript - 如何用外部图片生成 "screenshot"的html div?

c - 为什么这个 switch case 程序在整数输入之后不接受字符输入?

microcontroller - 在 C 中,静态局部变量和静态全局变量内存分配

javascript - JSON 数组与 MySql 之间的传入和传出。保存和循环

javascript - 人们在使用 Emacs 编辑包含 CSS、javascript 和 HTML 的网页时使用什么模式?

c++ - 从没有虚函数的 C++ 类继承

c++ - 优化对指针 vector 的 new 调用?

c++ - 使用 RcppArmadillo 时无法加载 Armadillo Cube<uword>

c - 需要编辑哪些文件才能将新用户添加到 ubuntu?