C++ inizia/fine/rbegin/rend viene eseguito in tempo costante per std::set, std::map, ecc.?

StackOverflow https://stackoverflow.com/questions/83640

  •  01-07-2019
  •  | 
  •  

Domanda

Per tipi di dati come std::set e std::map in cui la ricerca avviene in tempo logaritmico, è necessaria l'implementazione per mantenere gli iteratori di inizio e fine?L'accesso all'inizio e alla fine implica una ricerca che potrebbe avvenire in tempo logaritmico?

Ho sempre pensato che l'inizio e la fine avvengano sempre in un tempo costante, tuttavia non riesco a trovare alcuna conferma di ciò in Josuttis.Ora che sto lavorando su qualcosa in cui devo essere attento alle prestazioni, voglio assicurarmi di coprire le mie basi.

Grazie

È stato utile?

Soluzione

Accadono in un tempo costante.Sto guardando la pagina 466 dello standard ISO/IEC 14882:2003:

Tabella 65 – Requisiti dei contenitori

a.begin(); (complessità costante)

a.end(); (complessità costante)

Tabella 66 – Requisiti del contenitore reversibile

a.rbegin(); (complessità costante)

a.rend(); (complessità costante)

Altri suggerimenti

Sì, secondo http://www.cplusplus.com/reference/stl/, Begin(), End() ecc sono tutti O(1).

Nello standard C++, la Tabella 65 in 23.1 (Requisiti dei contenitori) elenca Begin() ed End() che richiedono tempo costante.Se la tua implementazione viola questo, non è conforme.

Basta guardare il codice, qui puoi vedere gli iteratori in std::map in GNU libstdc++

std::map

vedrai che tutto end rend cend...sono tutti implementati in tempo costante.

Fai attenzione però con hash_map.Begin() non è costante.

Per std::set

inizio:costante, fine:costante, rbegin:costante, rend:costante,

Per std::map

sono anche costanti (tutti)

se hai qualche dubbio, controlla www.cplusplus.com

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top