簡體   English   中英

C ++如何迭代直到動態數組結束?

[英]C++ How can I iterate till the end of a dynamic array?

假設我聲明了一個動態數組

int *dynArray = new int [1];

在某些時候用未知數量的int值初始化。

我將如何迭代直到我未知大小的數組結束?

另外,如果它讀取一個空格,那么它在陣列中的相應位置最終會被廢棄嗎?

從以下用戶復制輸入:

事情是:

a)我不允許使用STL(意思是:不)

b)我想將字符串分解為其字符並存儲它們。 到目前為止,我想使用這樣的函數:

 string breakLine (string line){


         int lineSize = line.size();

         const char *aux;

         aux=line.data();

         int index=0;


         while (index<=lineSize){
         mySynonyms[index]=aux[index]; 

         index++;
         }

如果要存儲的兩個數字之間有一個很大的空白區域(顯然不是),我認為數組aux最終會被廢棄。 我想知道是否有一種方法可以迭代到這種類型的數組中的未定義結束。 謝謝你的回答。

你沒有:將數組包裝成一個記住它的長度的結構: std::vector

std::vector v(1);
std::for_each( v.begin(), v.end(), ... );

沒有便攜的方式這樣做。 將大小與數組一起傳遞,或者更好地使用標准容器,例如std::vector

簡短的回答是,你做不到。 如果你有一個指向數組第一個元素的指針,你就無法知道數組的大小。 為什么要首先使用數組。 如果您的數組可以動態更改大小,那么使用std :: vector會更好,如果它是固定大小,則可以使用boost :: Array。

我不明白你的第二個問題。

您的代碼需要跟蹤數組,因此大小永遠不會是未知的。 (或者你必須使用一些帶有代碼的庫。)

我不明白你問題的最后部分。 你能詳細說說嗎?

您在下面的帖子中解釋過您想要查看std :: string的內容。

如果你期望你的stirng就像一個c-string(又名不包含NULL),那么使用line.c_str()而不是line.data()。 這將保證null的輔助點終止c風格的字符串。

之后你可以迭代直到aux [index] =='\\ 0';

否則,您可以使用line.data()和string.length / size來獲取它的大小,就像您的示例中一樣。

但是,“將字符串分解為其字符”是沒有意義的,字符串一個字符數組。 只需復制字符串並存儲即可。 你被允許這樣做:

char ch = line[index];

更好的是,在原始字符串上使用迭代器!

for(std::string::const_iterator it = line.begin(); it != line.end(); ++it) {
    const char ch = *it;
    // do whatever with ch
}

a)我不允許使用STL(意思是:不)

什么?? 那個蠢人的想法是什么?

std :: vector不是“STL”(HP的受版權保護的產品)的一部分,但是(並且已經有將近十年) 是C ++語言標准的一部分

如果你不允許使用STL(無論出於何種原因),你要做的第一件事就是實現你自己的版本 - 至少你需要的部分,以及你需要的可定制性。 例如,使用自定義allocator使您自己的vector類可參數化可能有些過分。 但盡管如此實現自己的輕量級vector 其他一切都將導致一個糟糕的,難以維護的解決方案。

使用向量,它有一個返回整數的vector.size()函數和一個返回迭代器的vector.end()函數。

您可以創建一個只有您需要的方法的簡單Vector類。 我實際上不得不為今年參加的課程重新創建Vector類,這並不是很困難。

如果某個值無效,則可以將其用作標記,並確保所有數組都以此終止。 當然,它容易出錯並且當你碰巧錯過一次時會導致難以發現的錯誤,但這是我們在FORTRAN中讀取文件時所做的事情(在全部大寫日期之前,在END之前)成為標准)。

是的,我在約會自己。

這就像家庭作業一樣,教師的目標是讓你感受到實現動態數組所需要的。 到目前為止你得到了F.

當你分配這樣的內存時,你需要意識到

int *dynArray = new int [1];

你准確地分配一個整數,而不是一個不確定數量的整數,由一些未知的魔法擴展。 最重要的是,你只能說

dynArray[0] = 78;

但你不能說

dynArray[1] = 8973;

索引1處的元素不存在,您正在進入未為您保留的內存。 當您取消分配數組時,此特定違規將導致崩潰,因為您存儲的內存8973屬於堆管理數據結構,並且您損壞了堆。

正如許多其他響應者所提到的,您必須始終知道陣列中有多少元素。 所以,你必須做一些事情

int arraySize = 1;
int *dynArray = new int [arraySize];

arraySize與數組一起使用,最好與一個C ++對象中的dynArray結合使用。

現在,在分配給dynarray [1]之前,你必須重新分配數組:

if (index > arraySize) {
  int newSize = index+1;
  int *newArray = new int[newSize]
  // don't forget to copy the data from old array to new
  memcpy(newarray dynArray, sizeof *newArray * arraySize);
  arraySize = newSize;
  dynArray = newArray;      
}
// now you're ready!
dynArray[index] = value;

現在,如果您想提高效率,可以分配超出需要的數量,因此每次添加元素時都不必分配。 我會將此作為練習留給讀者。

完成所有這些之后,你就可以提交你的作業了,你就會欣賞到為你做這一切的簡陋的std :: vector,還有更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM