Pętla zakresowa użyta na mapie pokazuje że elementy nie są do niej poprawnie insertowane. Konsekwencją niepoprawnego ułożenia mapy jest niemożliwość dostania się do niektórych jej elementów poprzez metodę find. Krótki kod, który obrazuje co się dzieje.
sf::ColorPlus c1("6dbac5ff");
for (auto color: tile_colors)
{
std::cout << "\"" << color.first.getHexStr() << "\": \"" << color.second << "\"";
if (color.first == c1)
std::cout << " <- szukany kolor";
std::cout << std::endl;
}
if (tile_colors.getIterator(c1) != tile_colors.end())
std::cout << "find znalazło kolor" << std::endl;
else
std::cout << "find nie znalazło koloru" << std::endl;
output jest następujący:
"000000ff": "unknown"
"36281cff": "ground"
"494637ff": "brick"
"5e5229ff": "mud"
"9c9c9cff": "stone"
"6dbac5ff": "water" <- szukany kolor
"ececc2ff": "sand"
find nie znalazło koloru
zwróćcie uwagę na to że element którego find nie znajduje nie jest ułożony zgodnie z "alfabetyczną" kolejnością. oczywiście w tym wypadku wyświetlany jest ciąg hexadecymanlny reprezentujący kolor a nie sam kolor.
metoda porównująca kolory wygląda tak:
bool ColorPlus::operator<(const ColorPlus& color) const
{
return (r < color.r ? true : (g < color.g ? true : (b < color.b ? true : a < color.a)));
}
elementy mapy są wkładane do niej w ten sposób:
data[key] = value;
gdzie data to std::map<sf::ColorPlus, std::string>
key to obiekt sf::ColorPlus
value to std::string
Dlaczego tak się dzieje?