簡體   English   中英

向量迭代器不可遞增

[英]vector iterator not incrementable

* 編輯:我刪除了else部分。 迭代器被迭代了兩次*

運行時出現錯誤:

文件:c:\\ program files(x86)\\ microsoft visual studio 10.0 \\ vc \\ include \\ vector行:99

表達式:向量迭代器不可遞增


文件:c:\\ program files(x86)\\ microsoft visual studio 10.0 \\ vc \\ include \\ vector行:100

表達式:“標准C ++庫超出范圍” && 0

當我的代碼在目錄中找到新圖片時,必須發送警報。 但是由於我無法自己刪除文件,因此我不得不欺騙。 找到圖像后發送警報之前,我先將其與已發送的圖片(sentPictures)進行比較。 在sendPictures中,我刪除了在目錄中刪除的圖像,因為如果我每次都要與過去找到的每個圖像進行比較,則該程序可能會有點笨拙,因為xD處於無限循環中。

這是我得到的錯誤。 為了找到存儲的元素是否仍在目錄中,我將舊元素向量(sentPictures)與新元素向量(refreshVector)進行了比較。 對於每個舊元素(sentPictures),如果在refreshVector中找不到它們,則將它們逐個刪除。 就我而言,即使什么都不做,我也會收到錯誤消息。 僅通過此循環就會崩潰。 就我而言,我的目錄中有9個元素,它打印5並崩潰。 我檢查了一下,sendPictures中再有多少元素,然后在refreshVector中。 我想我不能很好地使用迭代器。 這是一段代碼。

for(std::vector<Picture>::iterator it = sentPictures.begin(); it != sentPictures.end(); it++){
        std::cout << "1" << std::endl;

        if(std::find(refreshVector.begin(), refreshVector.end(), *it) == refreshVector.end()){ 
            tcout << *it <<std::endl;
            //if picture not found in refresh vector, then delete it
            //delete *it;
            //it = refreshVector.erase(it);
        }else{
            std::cout<< "2" <<std::endl;
            ++it;
        }

    }

PS:指令刪除*它; 無法編譯。 VS表示“表達式必須具有指針或句柄類型”,在“ *”符號的下面。 我將搜索if條件中是否使用了“ it”這一事實。

指令刪除*它; 無法編譯。

您正在嘗試刪除一個對象,刪除需要一個指針。 您也應該永遠不要刪除/刪除[]沒有使用new / new []分配的任何東西,由於您有一個帶有對象(不是指針)的向量,所以您似乎沒有這樣做。

如果要從容器中刪除某物,則應使用其適當的函數vector<T>::erase() delete僅適用於在堆上分配的對象。

同樣,在使用向量的情況下,您不必使用迭代器,則可以安全地使用索引。

for(int i=0; i != sentPictures.size(); i++)
{
   sentPictures[i]; //
   //etc
}

盡管find函數仍將返回迭代器。

另一個要注意的是,不要后增加迭代器,它會做一個冗余副本,而是先增加它,盡管不確定編譯器是否會優化它。

現在似乎已經解決了擦除問題,我需要遍歷這段代碼直到結束。 它崩潰了,但是不知道為什么。

它崩潰是因為您正在循環內進行擦除。 刪除元素時會更改數組大小,並且在執行刪除操作后, 迭代器將無效 從向量中刪除元素效率很低,您可能需要使用std :: set。

您無法delete未分配給new的對象,並且由於您擁有對象的向量而不是指針,因此我懷疑您已為它們分配了new

如果您要這樣做,則在迭代器上調用delete不會神奇地修改vector 請改用刪除/擦除慣用語(google)。

暫無
暫無

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

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