1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class ListeClients
{
public:
const Client& getClient(IdClient idClient) const;
std::vector<IdClient> getVoisinsDuPlusProcheAuPlusLoin(IdClient idClient) const;
// ...
private:
double distanceCarre(IdClient idX, IdClient idY) const;
std::map<IdClient, const Client*> m_clients;
// ...
};
double ListeClients::distanceCarre(IdClient idX, IdClient idY) const
{
//! \todo Mettre le résultat en cache pour optimiser ?
const Client& clientX = getClient(idX);
const Client& clientY = getClient(idY);
const Point positionX = clientX.getPosition();
const Point positionY = clientY.getPosition();
return positionX.distanceCarre(positionY);
}
std::vector<IdClient> ListeClients::getVoisinsDuPlusProcheAuPlusLoin(IdClient idClient) const
{
std::vector<IdClient> result;
const size_t nbClients = m_clients.size();
if(nbClients > 0)
result.reserve(nbClients-1);
for(auto paire_id_client : m_clients)
{
const IdClient idVoisin = paire_id_client.first;
if(idVoisin != idClient)
result.push_back(idVoisin);
}
std::stable_sort(result.begin(), result.end(),
[=,idClient](IdClient idX, IdClient idY)
{ return distanceCarre(idClient, idX) < distanceCarre(idClient, idY); }
);
return result;
} |