2016-04-07 37 views
-1

Bu my code: Ben bundan herhangi bir çıktı alamıyorum nedenBu vektörü yineleyen neden göremiyorum?

#include <iostream> 
#include <string> 
#include <vector> 
#include <cstdio> 
using std::printf; 

int main() 
{ 
    std::vector<int> array{1, 2, 3, 4, 5}; 

    for(auto i = array.begin(); i != array.end(); i++) { 
     auto index = i - array.begin(); 

     if(array[index] == 2 || array[index] == 5) { 
      i = array.erase(i); 
     } 

     printf("iteration | %ld\n", index); 
    } 
} 

? Printf yerine cout kullanarak ...

+0

sahip *i == 2 || *i == 5 yazabilirsiniz' edildi - aksi takdirde kazanılmış olacaktı 'printf' bildirilmemiş –

+0

@ MM ile ilgili hata mesajları cstdio ekleyemedi. İhtiyacım yok: O – markzzz

+2

'printf' –

cevap

4

5'u silerken, i = array.erase(i);, yineleyiciyi end()'dan terk edecektir. Fakat sonra, sonunu geçerek tanımsız bir davranışa neden olan i++ yaparsınız.

Bunu düzeltmek için mantığınızı değiştirin, böylece i++ yalnızca i = array.erase(i);'un gerçekleşmediği yinelemeler için oluşur.


Not: derleyici yazım hatası ya idiosyncracy çeşit sadece ben ` dahil uymamanın tahmin ediyorum yerine index

+0

Anladım. Ama neden printf hiçbir şey yazdırmıyor: O? Not: 'index' – markzzz

+2

ile daha iyi hissediyorum Programınız tanımsız bir davranışa sahip olduğunda, ne olursa olsun şimdiye kadar ne tür bir olay gerçekleşmişse, mangling yapmak da dahil olmak üzere bir şey olabilir. Programınız için segmentasyon hatasına kadar kişisel olarak çıkarım ama davranış –

+1

@ M.M'den farklı olabilir. – Barmar