【问题标题】:How can I retrieve a variable of type int[num_elem] from a heap-allocated array of type int*?如何从 int* 类型的堆分配数组中检索 int[num_elem] 类型的变量?
【发布时间】:2018-01-06 02:08:45
【问题描述】:

我需要访问我在堆上分配的数组上的 end() 和 begin() 等迭代器,如下所示:

int* init_env_heap = new int[NUM_ELEM];

这具有int* 类型,并且迭代器不会立即为它工作。

但是,当我在堆栈上分配它时,类型是 int[NUM_ELEM] 并且迭代器工作:

int init_env_stack[NUM_ELEM] = { };

如何在init_env_heap 上使用迭代器?

【问题讨论】:

    标签: c++ arrays iterator dynamic-memory-allocation


    【解决方案1】:

    关于迭代器的事情是它们模拟指针。堆分配区域的开头是指向第一个元素的指针。结尾是开头加上大小。

    只要你想到几件事就会很容易记住:

    • “开始迭代器”始终是指向第一个元素的指针
    • “结束迭代器”总是指向最后一个元素之外的元素
    • 对于任何有效的指针p 和索引i,表达式p + i 等于&p[i]

    在您的情况下,第一个元素由init_env_heap 指向,指向最后一个元素之外的一个元素的指针是&init_env_heap[NUM_ELEM],它等于init_env_heap + NUM_ELEM

    【讨论】:

    • 感谢您提醒我指针算法。不过,重构我的代码会很痛苦,因为在迭代器是隐式的情况下,for 循环得到了增强。那些似乎必须更改为 systemcpro 的 for 循环。这就是为什么我希望从 int* 转换为 int[elem] (代码中只有一个地方需要更改)
    【解决方案2】:

    指针已经符合迭代器的概念。例如,

    #include <iostream>
    
    int main(int, char**){
    
        constexpr int SIZE = 5;
        int values[SIZE] = {1,2,3,4,5};
        int* start = values;
        int* end = values + SIZE;
        for(int* iter = values; iter < end; ++iter)
            std::cout << "value: " << *iter << '\n';
    
    
    }
    

    【讨论】:

    • 它们在 lambdas 中的工作方式与普通迭代器等完全相同
    • 感谢您展示如何遍历这些值。正如我在对另一个答案的评论中指出的那样,我目前使用增强的 for 循环。我想我必须将它们更改为您在此处显示的 for 循环格式。似乎没有办法从我可用的 int* 类型中公开通常的 int[size] 类型。
    • @WuschelbeutelKartoffelhuhn - 您不必大量重构。编写一个提供数组“视图”的小实用程序,并具有返回这些指针的 beginend 成员。
    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2020-12-03
    • 2020-09-09
    相关资源
    最近更新 更多