Powiązane: what can I use as std::map
keys?Stosując (matematycznej) Wektor w std :: map
musiałem utworzyć odwzorowanie gdzie konkretne najważniejsze miejsca w przestrzeni mapie wykazów obiektów. std::map
wydawało się to możliwe.
Więc jestem wpisując się std::map
na xyz Vector
class Vector
{
float x,y,z
} ;
i robię std::map<Vector, std::vector<Object*> >
. Zauważ, że klucz tutaj jest nie jest a std::vector
, jest to obiekt z class Vector
, który jest po prostu wektorem matematycznym xyz mojego własnego tworzenia.
celu wytworzenia „ściśle słaby zamawiania” Pisałem następujące przeciążenie dla operator<
:
bool Vector::operator<(const Vector & b) const {
// z trumps, then y, then x
if(z < b.z)
{
return true ;
}
else if(z == b.z)
{
if(y < b.y)
{
// z == b.z and y < b.y
return true ;
}
else if(y == b.y)
{
if(x < b.x)
{
return true ;
}
else if(x == b.x)
{
// completely equal
return false ;
}
else
{
return false ;
}
}
else
{
// z==b.z and y >= b.y
return false ;
}
}
else
{
// z >= b.z
return false ;
}
}
Jest trochę długi, ale przede wszystkim sprawia, że tak może być dowolny wektor konsekwentnie mówi się, że mniej niż jakakolwiek inna wektor ((-1, -1, -1) < (-1, -1,1) i (-1, -1, 1)> (-1, -1, -1) na przykład).
Mój problem polega na tym, że to jest naprawdę sztuczne i chociaż je zakodowałem i działa, stwierdzam, że "zanieczyszcza" moją klasę Vector (matematycznie) za pomocą tego naprawdę dziwnego, sztucznego, nie matematycznego pojęcia "mniej niż" dla wektora.
Ale muszę utworzyć mapowanie, w którym określone kluczowe lokalizacje w mapie obszaru do niektórych obiektów, i std :: map wydaje się sposób to zrobić.
Sugestie? Gotowe rozwiązania gotowe!
Jeśli używasz pływaków, być może chcesz tego uniknąć z == b.z. Spróbuj czegoś takiego jak abs (z-b.z)
InsertNickHere
Jest to w pewnym sensie niezwiązane z konkretnym pytaniem (dlatego opublikuję je jako komentarz), ale ponieważ poprosiłeś o sugestie ... Używanie '== 'do porównywania wartości zmiennoprzecinkowych może być problemem. Jeśli dwie wartości różnią się tylko błędami zaokrągleń, czy naprawdę chcesz, aby były traktowane jako różne lokalizacje? Możesz chcieć traktować komponenty wewnątrz siebie "epsilon" jako równe, dla celów operatora porównania. –
@InsertNick: Wielkie umysły myślą podobnie! (Jednak głupcy rzadko się różnią ...) –