8
votes

C ++ std :: Ensemble égalité

J'essaie d'utiliser un std :: Set Pour avoir des éléments uniques dans mon conteneur.

Puisque j'ai des objets 3D: xxx

Ces objets sont égaux lorsque (AX == bx && ay == by && az == bz) .
Dans std :: Définir la mise en œuvre Un élément a == B Si (! (A A)) .
C'est impossible pour ma comparaison ... J'ai essayé de surcharger == opérateur.
J'ai choisi le conteneur défini pour comparer des valeurs lorsque j'appelle insert (a) . Je faisais quelque chose comme ça avec std :: vector v et son itérateur: xxx

avec xxx

le vérifier pour chaque objet (10000-100000) est coûteux en complexité.
Quelqu'un peut-il avoir une idée?


3 commentaires

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) pour une fonction de comparaison comp .


ouais, note à op: a == b if (! (a A)) devrait être a == b if (! (A


5 Réponses :


1
votes

vous avez pour fournir un opérateur de comparaison, car std :: Set nécessite sa mise en œuvre.

Un simple moins que l'opérateur ressemblerait à ceci: xxx


4 commentaires

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 est commandé, vous devez donc fournir une certaine commande. Si vous ne voulez pas commander vos points, n'utilisez pas définir .



1
votes

Vous devez déclarer l'opérateur <. Vous pouvez le faire comme ceci xxx

il est arbitraire, mais cela n'a pas d'importance. Tant que l'opérateur


1 commentaires

Non, cela ne pourrait pas, comme cela lui donnerait une modification pour retourner vrai à l'un des tests ultérieurs.



7
votes

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 : xxx


2 commentaires

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 , bien sûr. Mais alors vous devez vous tromper avec l'amitié. Une chose à la fois, hein?



5
votes

@OP: std :: set 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.

Si vous Vous ne voulez pas imposer une commande sur vos éléments, ne utilisez pas un conteneur commandé. Vous pouvez utiliser std :: nonOrdered_sed_sed si vous voulez simplement détecter l'unicité sans imposer une commande.


1 commentaires

Je pense que c'est ce que je cherchais. Merci



2
votes

Vous devez fournir un comparateur. Vous ne voulez pas implémenter 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 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: xxx

Vous fournissez ensuite cette fonction au constructeur de votre ensemble: xxx


1 commentaires

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