我需要访问像end迭代器()和()开始,我在堆上分配如下阵列上:如何从int *类型的堆分配数组中检索int [num_elem]类型的变量?
int* init_env_heap = new int[NUM_ELEM];
这有型int*
和迭代器没有为它立即工作。
当我将它分配在栈上,但是,类型为int[NUM_ELEM]
和迭代工作:
int init_env_stack[NUM_ELEM] = { };
我如何使用迭代器上?
我需要访问像end迭代器()和()开始,我在堆上分配如下阵列上:如何从int *类型的堆分配数组中检索int [num_elem]类型的变量?
int* init_env_heap = new int[NUM_ELEM];
这有型int*
和迭代器没有为它立即工作。
当我将它分配在栈上,但是,类型为int[NUM_ELEM]
和迭代工作:
int init_env_stack[NUM_ELEM] = { };
我如何使用迭代器上?
关于迭代器的一点是它们模拟指针。堆分配区的开始处是指向第一个元素的指针。结尾是开始加上大小。
它会很容易记住的是,你只是觉得一对夫妇的事情:
p
和索引i
,表达式p + i
等于&p[i]
。在你的情况下,第一元件被指向,和一个指针到一个超出最后元件是&init_env_heap[NUM_ELEM]
,其等于init_env_heap + NUM_ELEM
。
指针已经符合迭代器的概念。例如,
#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';
}
它们的工作方式与正常迭代器完全一样。 – systemcpro
感谢您展示如何遍历这些值。正如我在对其他答案的评论中指出的那样,我目前使用增强型for循环。我想我必须将它们更改为您在此处显示的for-loop格式。似乎没有办法从我可用的int *类型中暴露通常的int [size]类型。 –
@WuschelbeutelKartoffelhuhn - 你不必重构。编写一个提供数组“视图”的小工具,并有一个返回这些指针的“begin”和“end”成员。 – StoryTeller
感谢您提醒我有关指针算术。重构我的代码会很痛苦,因为迭代器隐含的增强了循环。那些将不得不改为systemcpro的循环,看起来像。这就是为什么我希望从int *到int [elem]的转换(代码中只有一个地方需要更改) –