2015-10-12 6 views
22

Ho un programma C++ in cui voglio inserire valori predefiniti per qualsiasi tasto mancante in un std::map. Sto pensando che il modo più semplice per farlo sarebbe quello di usare std::map::operator[]() come il comando touch POSIX - cioè, di lasciare il valore invariato se già esiste, ma di crearlo se non lo fa. Per example,Posso fare affidamento su std :: map :: operator [] per toccare?

#include <map> 
#include <vector> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    vector<int> keys = {0, 1}; 

    map<int, int> m; 
    m[1] = 5; 
    m[2] = 12; 

    for (const int i : keys) 
    { 
     m[i]; // touch value 
    } 

    for (auto const & kv : m) 
    { 
     cout << kv.first << ", " << kv.second << endl; 
    } 
} 

Posso essere sicuro che il compilatore non ottimizzare le m[i]; dichiarazioni, dal momento che io non sono il "fare" qualcosa con loro? (Non assegnando esplicitamente a, non leggendo da.)

risposta

17

Sì, si può essere sicuri. Ottimizzare la chiamata allontanerebbe il comportamento osservabile del tuo programma e il compilatore non è autorizzato a farlo (tranne nel caso di RVO).

Questo è noto come as-if rule.

+0

Puoi citare una fonte? –

+0

@ cp.engr Vedi modifica. –

+0

Grazie. Posso suggerire di citare questo bit nella tua risposta? "Un'implementazione reale non deve valutare parte di un'espressione se può dedurre che il suo valore non è usato e che non vengono prodotti effetti collaterali che influenzano il comportamento osservabile del programma." Dal secondo blocco nella risposta accettata che hai collegato. –

5

L'operatore [] esegue infatti il ​​valore predefinito, ovvero il valore che si troverà nella posizione di tale chiave se non le si assegna nulla.

Reference Link

Se k non corrisponde alla chiave di qualsiasi elemento del contenitore, la funzione inserisce un nuovo elemento con quella chiave e restituisce un riferimento al suo valore mappato. Si noti che questo aumenta sempre la dimensione del contenitore di uno, anche se non è assegnato alcun valore mappato all'elemento (l'elemento viene costruito utilizzando il suo costruttore predefinito).

6

Sì, si può essere sicuri. E 'forse più intuitiva se si considera che la linea in questione è equivalente a questo:

m.operator[](i); 

& hellip; e che non ti aspetti funzione arbitraria chiama ad essere ottimizzato dal vostro programma, se lo fanno nulla.