J'ai deux vecteurs d'objet. Quelque chose comme: Je veux obtenir un troisième vecteur contenant la Toutes idées sur la mise en œuvre PS Les vecteurs peuvent EDIT:
et je ne veux pas modifier all_things code>.
e.g. p>
4 Réponses :
Si vous ne pouvez pas les commander, vous pouvez utiliser la force brute. Il suffit de comparer les vecteurs. E.g:
Pourquoi redimensionnez-vous tout code>? Pourquoi laissez-vous les entrées dans la sous-plage [
it code>,
good.end () code>) partiellement formé?
+1 Aussi, ne vous sentez pas mal quant à l'utilisation de la force brute avec un std :: vecteur plutôt que d'utiliser un autre conteneur. En fonction de vos circonstances, cela pourrait en réalité être l'approche la plus rapide, grâce au fait que vecteur place ses valeurs dans une seule allocation contiguë.
La dernière ligne ne semble pas fonctionner. Exemple en direct.
Pourquoi est-ce que vous construisez-vous par défaut de sorte que chose code> s dans
bon code> qui est inutile et évitable?
@Nickyc: parce que c'est un exemple friggin. Vous pouvez simplement utiliser un inserteur du dos et ne pas redimensionner. Cela dépend fortement du cas d'utilisation. Donc, pour la question, c'est plutôt inutile comment vous le faites.
Si chose code> est coûteux à construire / copier et son conteneur est long et les mauvaises sont accablantes, ce n'est pas une bonne idée de construire un même tableau "pas mal". En fait, une matrice de drapeau de tout () x Good.Size () doit être remplie sur la base de la comparaison code>. Si l'unicité est assurée, il pouvait être épargné par des mauvais méchants. Mais O (n 2 sup>) est la complexité de toute façon. P>
Je voudrais suggérer du code similaire à MKAES, mais avec quelques ajustements:
std::vector<thing> substract(const std::vector<thing>& a, const std::vector<thing>& b) { std::vector<thing> sub; sub.reserve(a.size()); for (const auto &item : a) { if (std::find(b.begin(), b.end(), item) == b.end()) { sub.push_back(a); } } return sub; }
Améliorer? Peut-être pas, mais cela ne déclenche pas inutilement tout.Size () code> constructeurs par défaut. Constructeur par défaut pour
TYPE CODE> n'est même pas obligé d'exister. Il est toujours préférable d'appeler
réserve code> que de déclencher la réaffectation.
des commentaires, votre Et c'est ok. p>
Triez-les sans signification. P>
écrire une fonction qui prend deux appelez ceci maintenant Maintenant, cela peut être coûteux si les choses sont coûteuses à copier. Ainsi, créez plutôt deux vecteurs de Alternativement, envisagez d'écrire un chose code> s peut être trié, mais de manière inutile. P>
chose code> s et donnez-leur un ordre sans signification qui est cohérent et que deux choses ne comparent que non-moins qu'elles sont égales. P>
bool arb_order_thing (Thing Const &, Thing Const &) Code>. P>
std :: Trier code> Les deux vecteurs et utilisez
std :: set_difefence code>. p>
Const * code>, écriture
bool arb_ordr_thing_ptr (chose const *, chose const *) code> (qui ne dispose pas de la commande sans signification), triez les vecteurs. -Of-Pointeurs utilisant cela, utilisez Set_Difefence en utilisant cela, puis convertissez-le à un
vecteur
Const * code> hasher (pas un
std :: hash
Unommanded_set
std :: copy_if code> testant contre le hachage sur l'autre vecteur. P>
Les éléments de vos vecteurs sont-ils uniques?
Pensez à utiliser
std :: Set code>
@Paolom
std :: Set code>
nécessite un tri (Ce que les États de l'OP n'est pas possible), il devrait donc utiliser unstd: : ONUORDEDED_SET CODE>
si les éléments sont uniquesEst-ce que
chose code> a un opérateur
approprié == code> ou équivalent?
@Mme. oui c'est unique
Je pense que la classe "chose" devrait avoir une surcharge d'opérateur == comme Andyg suggère que votre code devra vérifier l'équivalence d'objets "truc". La réponse donnée par MKAES ne semble pas compiler non plus, sans la surcharge de l'opérateur. Après avoir ajouté l'opérateur, il devrait s'agir d'une tâche triviale de faire une boucle dans une boucle et de générer le vecteur "Good_things".
J'ai du mal à imaginer quelque chose qui ne peut pas avoir une commande. Si tout le reste échoue, utilisez
memcmp code> avec
std :: Trier code>, puis effacée linéaire.
@NWP: chose de classe {privé: CV :: tapis quelque_photo; } ... bien sûr cv :: mat est quelque chose comme bitmap
Alors, pourquoi ne triez-vous pas
chose code> par les valeurs RVB du bitmap?
Est-ce même un sens? Qu'en est-il du coût?
Vous pouvez avoir confiance
memcmp code> pour être extrêmement bien optimisé. Et chances que vous comparez seulement quelques octets. Si vous pouvez
Déplacer code>
chose code> s efficacité que vous pouvez simplement trier. Sinon, vous pouvez vous assurer de les insérer dans la position correcte lors de la création. Une autre façon serait de garder un
vecteur bon; code> que vous mettez à jour sur chaque insertion / retrait. L'algorithme le plus efficace du
Soustraire code> est de ne pas en avoir besoin, ce qui semble assez faisable.
@nwp Je pense que j'ai mal compris quelque chose.
Une chose code> peut-elle avoir une commande sans signification, mais logiquement correcte, a-t-elle été ajoutée? Qu'est-ce que
== code> fait à un
chose code>? Est-il pratique de hacher un
chose code>? Peut-on ajouter un champ pour cacher le hachage et avoir ce cache être fiable?
Je pense que oui .. Peut-être que ma question est commandée maintenant, ce qui est facile à résoudre. Cependant, je ne veux pas changer cela causer le cas sans commande peut aussi être intéressant!
@Humamhelfawefawi Assurez-vous qu'il est en fait un (total) Commander . Commander Pokemon par type avantage ne fonctionne pas car il n'a pas de commande, mais les commander par alphabet fonctionne. En utilisant
aléatoire code> ne produit pas de commande, à l'aide de
memcmp code> fait. Et bien sûr, vous devez être cohérent et ne pas changer l'ordre.