J'essaie d'utiliser un Puisque j'ai des objets 3D: p> Ces objets sont égaux lorsque avec p> le vérifier pour chaque objet (10000-100000) est coûteux en complexité. std :: Set Code> Pour avoir des éléments uniques dans mon conteneur.
(AX == bx && ay == by && az == bz) code>.
Dans std :: Définir la mise en œuvre Un élément a == B Si (! (A A)) Code>.
C'est impossible pour ma comparaison ... J'ai essayé de surcharger == code> opérateur.
J'ai choisi le conteneur défini pour comparer des valeurs lorsque j'appelle insert (a) code>.
Je faisais quelque chose comme ça avec
std :: vector v code> et son itérateur: p>
Quelqu'un peut-il avoir une idée? p> p>
5 Réponses :
vous avez em> pour fournir un opérateur de comparaison, car Un simple moins que l'opérateur ressemblerait à ceci: p> std :: Set code> nécessite sa mise en œuvre.
Vous devriez faire cette fonction const.
Bien sûr, mais qu'est-ce que cela signifie pour les points? Comment un point peut être inférieur à une autre sauf à distance, mais dans ce cas, mon égalité ne correspond pas.
@ user1788477: il ne doit pas nécessairement être opérateur << / code>. Vous pouvez faire une fonction globale et nommez-la une chose que vous souhaitez, et de fournir cela comme un argument de modèle supplémentaire pour votre ensemble. Donc, il ne faut pas vouloir dire qu'un point est inférieur à un autre. Cela doit simplement fournir un moyen de les commander.
@ user1788477 - SET code> est commandé, vous devez donc fournir une certaine commande. Si vous ne voulez pas commander vos points, n'utilisez pas
définir code>.
Vous devez déclarer l'opérateur <. Vous pouvez le faire comme ceci il est arbitraire, mais cela n'a pas d'importance. Tant que l'opérateur
Non, cela ne pourrait pas, comme cela lui donnerait une modification pour retourner vrai à l'un des tests ultérieurs.
Vous devez implémenter une commande stricte de commande << / code> pour votre classe. Le moyen le plus simple consiste à utiliser l'ordre lexicographique fourni par
tuple code>:
Il ne doit pas nécessairement être opérateur << / code>. Cela ne devrait pas non plus. L'OP est correct qu'il n'a pas vraiment de sens que l'un des objectifs d'être considérés moins d'une autre sur la base de certaines décisions arbitraires concernant la signification relative des coordonnées X, Y et Z.
@Benjaminlindley: Eh bien, il est logique que l'ordre lexicographique des tuples de choses ordonnées individuellement. Et comme il n'y a pas de commande «géométrique» sur le domaine de l'OP de toute façon, il n'y a aucun risque de confusion. Si vous préférez, vous pouvez spécialiser std :: moins
@OP: Si vous Vous ne voulez pas em> imposer une commande sur vos éléments, ne em> utilisez pas un conteneur commandé. Vous pouvez utiliser std :: set code> est un conteneur unique et commandé. Il nécessite soit un opérateur
<< / code> ou un comparateur transmis explicitement, ce qui implémente une forte commande stricte. P>
std :: nonOrdered_sed_sed code> si vous voulez simplement détecter l'unicité sans imposer une commande. P>
Je pense que c'est ce que je cherchais. Merci
Vous devez fournir un comparateur. Vous ne voulez pas implémenter Vous fournissez ensuite cette fonction au constructeur de votre ensemble: p> opérateur << / code>, et je suis d'accord avec cette décision. Vous ne devriez pas fournir de fonctions sans signification pour votre classe juste pour satisfaire les contraintes de certains conteneurs. Heureusement, vous n'avez pas besoin de
opérateur << / code>. Mais vous avez besoin d'une fonction qui a un comportement similaire à
opérateur << / code>. Il n'est pas nécessaire que le signifie em> qu'un objet est considéré comme inférieur à un autre. Il doit simplement fournir un ordre strict-faible. Vous pouvez lui donner n'importe quel nom que vous voulez. Par exemple:
Cette solution est supérieure. Merci beaucoup, il suffit d'utiliser cela à mon travail aujourd'hui après des heures d'essayer de le comprendre
Stackoverflow.com/Questtions/127822225/... a une discussion similaire qui pourrait vous aider.
Vous pouvez fournir votre propre fonction de comparaison, elle n'a pas besoin de pas nécessairement moins que l'opérateur. Il doit obéir Strict Faible commande , cependant. La définition de l'égalité devient alors
! Comp (a, b) &&! Comp (b, a) code> pour une fonction de comparaison
comp code>.
ouais, note à op:
a == b if (! (a A)) code> devrait être
a == b if (! (A