2014-10-28 18 views
5

Voglio aggiornare il vettore 'v' in modo che possa scorrere dal conteggio 0-100.perché il vettore non si aggiorna in loop?

So che questo non è consentito, ma cosa succede se voglio fare questo solo? C'è qualche modo?

int main() { 
    // your code goes here 
    vector<int> v; 
    v.push_back(1); 
    int count = 0; 

    for(int elem: v){ 
     if(count<100) 
     v.push_back(count); 
     count++; 
    } 

    for(int elem: v) 
    cout << elem << endl; 

    return 0; 
} 

L'output è:

1  
0 
+2

È previsto l'output dal codice. Non capisco cosa stai cercando di fare. 'for (int i = 0; i <100; i ++)'? –

+2

@NeilKirk pensa che la lunghezza di v in per (int elem: v) sarà aggiornata –

+0

@Thomas Oh capisco, non l'ho notato! –

risposta

11

Come si può vedere dalla definition della gamma-based per loop, il end_expr non si aggiorna tra le iterazioni. Pertanto hai solo una iterazione. push_back invalida v.end() (che è cosa end_expr è come descritto nella pagina collegata), quindi quello che hai è in realtà un comportamento indefinito.

Il modo forse più semplice per riempire vettoriale con 0..100 sarebbe:

vector<int> v(101); 
std::iota(v.begin(), v.end(), 0); 
+2

Si desidera '(101)', non '{101}'. –

+0

Grazie, corretto. – user2079303

3

Si consiglia di utilizzare questo codice al posto

int count = 0; 
while (v.size() < 100) { 
    v.push_back(count++) 
} 

Modifica vettore mentre iterare attraverso di essa non è permesso

+0

_ "So che questo non è permesso, ma cosa succede se voglio fare questo solo ??" _ – P0W

+1

per (int elem: v) { cout << elem << endl; if (count <100) v.push_back (count); count ++; } se il ciclo è così? @nnesterov –

+1

grazie ragazzi, e non so indent nella sezione commenti :(scusate per quello –

2

utilizzando il codice:

for(int elem: v){ 
    if(count<100) 
     v.push_back(count); 
    count++; 
} 

è come usare questo:

int i = v.size(); 
for(int j = 0; j < i; j++){ 
    v.push_back(j); 
} 

Io in realtà non so perché ... V.SIZE() potrebbe essere di tenere in memoria per l'ottimizzazione e la protezione dei dati

Edit dopo il commento OP:

Prova questo

int i = v.size(); 
for(int j = 0; j < i; j++){ 
    if(j<100) 
     i = v.size(); 
    v.push_back(count); 
} 
+0

intendete 'v.size()'? –

+0

@NeilKirk sì, il mio male –

+0

userà 'iteratore' e non indice, (e così ho portato a UB). – Jarod42

2

Il modo migliore efective per questa operazione

vector<int> v; 
v.resize(100); 
for(unsigned int i = 0; i < v.size(); i++) 
{ 
    v[i] = i; 
} 

come sopra.

+1

"Migliore efficace" in termini di cosa? – Sambuca

+0

il metodo push_back è coercitivo in modo che possiamo impostare la dimensione del vettore prima di ve assegnare i valori. e penso che iota non abbia avuto prima di C++ 11? ho ragione? quindi se usi la vecchia versione C++ non puoi usare iota. –

2

Un range-based for loop produce codice simile a questo:

{ 
auto && __range = range_expression ; 
    for (auto __begin = begin_expr,__end = end_expr; __begin != __end; ++__begin) { 
     range_declaration = *__begin; 
     loop_statement 
    } 
} 

Come si può vedere il campo non verrà aggiornato come si sta scorrendo sopra il vostro contenitore.

Inoltre, molto probabilmente si finisce con un comportamento indefinito perché, poiché i valori di pushing back sono vector, questi iteratori verranno invalidati in caso di ridimensionamento.

Vedere @ user2079303 per un modo migliore per riempire il numero vector.

+1

in realtà la mia intenzione non è quella di riempire il vettore in questo modo, piuttosto volevo sapere c'è un modo per aggiornare la gamma di vettori nei loop? –

+0

Non penso davvero che sarebbe una buona idea per l'intervallo all'interno del ciclo, anche se fosse possibile. Perchè vuoi fare questo? – Sambuca

+1

Ho pensato di inserire elementi in vettoriale e simultaneamente iterarlo, non è possibile in vettoriale ma in std :: list, stavo solo provando che StackOverflow può trovare in qualche modo o no: p –

Problemi correlati