Mam obiekt std :: map map<string , Property*> _propertyMap
, gdzie string
jest nazwą nieruchomości i Property*
zawiera wartości właściwości.std :: mapa uzyskać wartość - znaleźć vs ręcznie pętli
muszę przetworzyć wartości właściwości i konwertować je do konkretnych danych Format- każda nieruchomość ma swój własny format, na przykład jeśli inicjalizacja mapa jest w następujący sposób:.
_propertyMap["id"] = new Property(Property::UUID, "12345678");
_propertyMap["name"] = new Property(Property::STRING, "name");
....
następnie "id"
powinny być przetwarzane inaczej niż "name"
itd.
Oznacza to, że muszę wyszukać każdą właściwość na mapie i odpowiednio przetworzyć jej wartości.
Pomyślałem o dwóch sposobach, aby to zrobić.
Jeden użyć std::map::find
sposób, aby uzyskać konkretną nieruchomość, tak:
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
}
....
Dwa, iteracyjne mapę i dla każdego wpisu sprawdzić co nazwa m.in. jest i postępować odpowiednio:
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
}
.....
}
Biorąc pod uwagę, że Time complexity of std::map::find is O(logN), złożoność pierwszego rozwiązania to O(NlogN)
. Nie jestem pewien co do złożoności drugiego rozwiązania, ponieważ iteruje on mapę raz (O(N)
), ale wykonuje dużo if-else
każdej iteracji. Próbowałem odpowiedzieć na wspólne pytania dotyczące map::find()
, ale nie mogłem znaleźć żadnych przydatnych informacji; większość z nich wystarczy pobrać jedną wartość z mapy, a następnie find()
robi to z większą złożonością (O(logN) vs O(N)
).
Jakie jest lepsze podejście? a może jest jeszcze jedna, o której nie myślałem?
Również styl kodowania mówi, który z nich jest lepszym kodem?
Wygląda jak dziwnie i nie jest jasne (dla mnie). E.g w twoim '_propertyMap [" id "]' powinien być tylko jednym elementem, czy powinna to być lista lub wektor? Niż masz zamiar napisać N else if lub find statement? Jeśli dobrze pamiętam, dla teorii złożoności liczone są tylko porównania. Który będzie N * N dla twojego drugiego "rozwiązania" –
Mapa zawiera właściwości, każda właściwość ma klucz ('string') i wartość (obiekt typu' Właściwość * '). W tym przykładzie '_propertyMap [" id "]' jest wpisem zawierającym klucz "id" i wartością 'new Property (Property :: UUID," 12345678 ")' i tak dalej dla każdej pozycji mapy. Następnie chcę przetworzyć dane, więc muszę znaleźć konkretny wpis, którego nie wiem, jak znaleźć; używając 'find' lub pętli. – user3114639
@ hr_11, To jest moje pytanie; czy drugi jest rzeczywiście O (N * N)? ponieważ nie wszystkie "if-else" zostaną osiągnięte w każdej iteracji, więc może to również O (NlogN). Również nie jestem pewien, co jest lepszy i klarowniejszy kod. – user3114639