J'appelle une méthode qui retourne Voici un exemple simple:
Laissez le type Je ne suis pas autorisé à modifier la mise en œuvre de Comment feriez-vous cela? P> std :: Set
t code> est un type de classe. Ce que j'essaie d'atteindre est de vérifier si l'ensemble contient un objet de type
t code> avec des valeurs de champ spécifiques pour une affirmation dans un test automatisé. Cette vérification doit être effectuée pour plusieurs objets. P>
t code> être
voiture code> donc un exemple
définir code> contient un tas de voitures. Maintenant, je veux trouver une voiture avec une couleur spécifique
t code>. L'utilisation de Boost serait ok. P>
5 Réponses :
Vous pouvez essayer un opérateur de dépassement EJ: P>
bool operator<(const Car& a, const Car& b) { return a.color<b.color || (a.color==b.color && a.doors<b.doors) || (a.color==b.color && a.doors==b.doors && a.top_speed<b.top_speed); } std::set<Car> cars; Car x; cars.find(x);
Face à de tels problèmes, je garde habituellement: p>
std :: deque code> ou std :: vecteur code> de voitures li>
- Pour chaque propriété que vous souhaitez rechercher, un
std :: multiset code> des pointeurs vers des voitures, triés par la valeur de la propriété. Li>
ul>
Je cache soigneusement ces conteneurs dans une classe qui me permet d'insérer des voitures. P>
L'interface de requête peut varier, mais généralement, vous tirez parti de multiset :: égal_range code>, std :: Trier code> et std :: set_intersection code >. P>
Si vous voulez une Volvo rouge quoi que ce soit ... voiture, vous p>
- extrait de
égal_range code> Toutes les voitures rouges, vous donnant une paire itératrice li>
- extrait de
égal_range code> Toutes les voitures Volvo, vous donnant une paire Itératrice li>
- ... li>
- Trier toutes ces gammes par un prédicat commun, disons par adresse du pointeur li>
- Appliquer à plusieurs reprises
Set_InterSection code> dans un std :: deque code>. li>
ol>
Un autre moyen est de stocker les voitures dans un deque code>, de les énumérer et de choisir celui qui répond à toutes vos propriétés, en utilisant std :: Trouver code>. Cela peut toutefois avoir une complexité pire cependant (cela dépend du nombre de voitures rouges que vous avez pour la naissance) p>
Cela dépend de la mise en œuvre de t code>. Collons-vous à votre exemple d'une classe
voiture code>. Supposons que la classe ressemble à ceci comme ceci:
struct find_by_color {
find_by_color(const std::string & color) : color(color) {}
bool operator()(const Car & car) {
return car.color == color;
}
private:
std::string color;
};
// in your code
std::set<Car>::iterator result = std::find_if(cars.begin(), cars.end(),
find_by_color("green"));
if(result != cars.end()) {
// we found something
}
else {
// no match
}
Ordre lexicographique FTW. Bonne prise. Si vous souhaitez plus de questions générales, mais cela a des limitations (trouvez tous i> les voitures rouges Volvo)
Utilisez #include
Le STD :: Set vous permet de fournir votre propre fonction de comparaison, comme dans comparer uniquement les valeurs que vous vous souciez et qu'elles agiront comme si des objets avec ces valeurs sont =. Notez que vous aurez probablement besoin d'un multiset pour cela. P> Ce serait le moyen de le faire si vous vous souciez vraiment de la performance de connexion. P> P>
Vous voulez std :: recherche_if code>, avec un objet de fonction de prédicat qui vérifie les propriétés qui vous intéressent. Cela pourrait ressembler à ceci:
struct FindCar {
FindCar(Colour colour, int doors, double top_speed) :
colour(colour), doors(doors), top_speed(top_speed) {}
bool operator()(Car const & car) const {
return car.colour == colour
&& car.doors == doors
&& car.top_speed == top_speed;
}
Colour colour;
int doors;
double top_speed;
};
std::set<Car> const & cars = get_a_set_of_cars();
std::set<Car>::const_iterator my_car =
std::find_if(cars.begin(), cars.end(), FindCar(Red, 5, 113));
Cela défait le but de std :: set code>, non?
std :: Set code> est capable de trouver des éléments dans
o (journal (n)) code> à l'aide de la recherche binaire. Si vous faites cela, essayez de comprendre comment utiliser
std :: Set :: Rechercher code> ou
std :: binaire_search code>.
Voulez-vous composer la règle (rouge + Sedan + 200 km / h) au moment de l'exécution? Ou est-ce suffisant de codage dur?
Les règles codées sont suffisantes.