我需要訪問像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]的轉換(代碼中只有一個地方需要更改) –