J'ai un extrait de code comme celui-ci, pour être compilé sous VC ++ 2010.
std::set_intersection<std::set<int>::const_iterator, std::set<int>::const_iterator, std::set<int>::iterator>( s1.begin(), s1.end(), s2.begin(), s2.end(), res_set.begin() );
3 Réponses :
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(res_set, res_set.end()));
à la place, vous voulez un res_set.begin () code> ne peut pas être utilisé comme argument de sortie de
set_intersection code> pour deux raisons:
insert_iterator code>, pour insérer les nouveaux éléments dans le jeu: P>
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
std::inserter(res_set, res_set.end()))
L'argument de sortie à un Dans votre cas, vous pouvez remplacer votre std :: set_intersection code> doit être à un mutable
valeur_type code>. Les itérateurs de
std :: set code> ne supportent jamais la mutation,
depuis que le changement de valeur d'un élément pourrait changer où il appartenait
l'ensemble. Fonctions dans le groupe avec
std :: set_iteratorator code> sont conçus
travailler sur des séquences triées, par exemple.
std :: vecteur code>. p>
std :: Set code> avec
std :: vecteur code>,
les trier au besoin (et éventuellement utiliser
std :: inférieur code> et
insertion à les garder triés face à l'insertion) ou à utiliser
std :: insert_iterator (res_set, res_set.end ()) code>. p>
Pour le compte rendu, j'avais pensé que l'intersection de deux ensembles doit avoir une forme triviale. Je suis un peu surpris qu'il n'y ait aucune méthode d'intersection qui traite de l'ensemble par défaut. Soit j'ai manqué quelque chose ou c'est une lacune de la STL.
James, les fonctions définies sont conçues pour être utilisées sur des ensembles autant qu'ils doivent être utilisés sur des vecteurs triés. Changer simplement que l'ensemble sur un vecteur ne résoudra rien. Ce qui ne va pas, c'est juste le paramètre final, qui ne peut pas être écrit à. Un insert Itérateur corrige cela pour un ensemble ou i> un vecteur.
std :: Set Code> n'est pas vraiment un ensemble dans le sens mathématique. Ou du moins, ce n'est que partiellement un. En général, en informatique, un ensemble est simple une collection non ordonnée sans doublons et une recherche plus ou moins rapide.
STD :: SET CODE> ajoute la commande, mais remplit sinon cette définition. (Pascal a eu des ensembles dans le sens mathématique, mais ils étaient limités à de petits entiers. Plus comme
std :: bitset code>.)
@ROBKENNEDY C'est un problème supplémentaire: avec std :: vecteur code>, vous pouvez écrire quelque chose comme
res_set.réesize (S1.Size () + s2.Size ()); Code> res_set.herase (STD :: Set_InterSection (S1.BeGIN (), S1.end (), S2.EGIN (), S2.end (), Res_set.begin ()), RES_SET.END ())
. De toute façon, la contrainte pour code> S1` et
s2 code> est que les données sont triées: Utilisation
std :: Set code> est un moyen d'y parvenir (et souvent le le plus simple et le meilleur), mais pas le seul moyen.