Ho un oggetto std :: map map<string , Property*> _propertyMap
, dove string
è il nome della proprietà e Property*
contiene i valori della proprietà.std :: map get value - find vs handcrafted loop
Ho bisogno di elaborare i valori delle proprietà e convertirli in un dato specifico Formato- ogni proprietà ha il proprio formato, ad esempio se la mappa inizializzazione è la seguente:.
_propertyMap["id"] = new Property(Property::UUID, "12345678");
_propertyMap["name"] = new Property(Property::STRING, "name");
....
poi "id"
vanno trattati differentemente di "name"
ecc.
Ciò significa che devo cercare ogni proprietà nella mappa ed elaborare i suoi valori di conseguenza.
Ho pensato a due modi per farlo.
One, utilizzare std::map::find
metodo per ottenere una proprietà specifica, come quella:
map<string , Property*>::iterator it1 = _propertyMap.find("id");
if(it1 != _propertyMap.end())
{
//element found - process id values
}
map<string , Property*>::iterator it2 = _propertyMap.find("name");
if(it2 != _propertyMap.end())
{
//element found - process name values
}
....
Due, iterare la mappa e per ogni voce di controllare ciò che il nome della proprietà è e procedere di conseguenza:
for (it = _propertyMap.begin(); it != _propertyMap.end(); ++it)
{
//if it is events - append the values to the matching nodes
if (it->first == "id")
{
//process id values
}
else if (it->first == "name")
{
//process name values
}
.....
}
Dato che il Time complexity of std::map::find is O(logN), la complessità della prima soluzione è O(NlogN)
. Non sono sicuro della complessità della seconda soluzione, perché itera la mappa una volta (O(N)
), ma esegue molto if-else
ogni iterazione. Ho provato a rispondere alle domande comuni su google map::find()
, ma non sono riuscito a trovare alcuna informazione utile; molti di questi hanno solo bisogno di ottenere un valore dalla mappa, e quindi lo find()
lo fa con una maggiore complessità (O(logN) vs O(N)
).
Qual è un approccio migliore? o forse ce n'è un altro a cui non ho pensato?
Inoltre, lo stile del codice parla, quale è il codice più buono e chiaro?
Sembra strano e non chiaro (per me). E.g nella tua '_propertyMap [" id "]' dovrebbe essere solo un elemento, o dovrebbe essere una lista o un vettore? Di quanto hai intenzione di scrivere N altrimenti se o trova la dichiarazione? Se ricordo correttamente per la teoria della complessità, vengono contati solo i confronti. Quale sarà N * N per la tua seconda "soluzione" –
La mappa contiene proprietà, ogni proprietà ha una chiave ('stringa') e valore (oggetto di tipo' Proprietà * '). Nell'esempio, '_propertyMap [" id "]' è una voce che contiene la chiave "id" e il valore 'new Property (Property :: UUID," 12345678 ")' e così via per ogni voce della mappa. Quindi voglio elaborare i dati, quindi ho bisogno di trovare una voce specifica, che non so come trovare; usando 'find' o un ciclo. – user3114639
@ hr_11, questa è la mia domanda; il secondo è davvero O (N * N)? perché non tutti i 'if-else 'saranno raggiunti ogni iterazione, quindi forse è anche O (NlogN). Inoltre non sono sicuro di quale sia un codice migliore e più chiaro. – user3114639