STL Schnittpunkt und die Ausgabe setzen

7

Ich habe ein Code-Snippet wie dieses, das unter VC ++ 2010 kompiliert wird.

%Vor%

Soweit ich das beurteilen kann, sollte das funktionieren. Ich bekomme jedoch Build-Fehler:

%Vor%

Dafür habe ich explizite Template-Parameter-Deklaration gemacht:

%Vor%

Aber ich habe die gleichen Fehler. Mein Problem hier ist, dass im zweiten Fall, wenn ich einen const_iterator übergeben würde, sollte es mit einem Konvertierungsfehler zwischen const_iterator und Iterator fehlschlagen, da der Parametertyp nicht zusammenpassen würde. Was vermisse ich hier? (Ich kenne die "Inserter" -Form von set_intersection, aber ich möchte lernen, was ich hier falsch mache)

    
progician 06.02.2012, 13:42
quelle

3 Antworten

8

Das Ausgabeargument für std::set_intersection muss veränderbar sein %Code%. Die Iteratoren von value_type unterstützen niemals Mutationen, da sich der Wert eines Elements ändern könnte, wo es hingehört der Satz. Funktionen in der Gruppe mit std::set sind entworfen um an sortierten Sequenzen zu arbeiten, z.B. %Code%.

In Ihrem Fall können Sie entweder std::set_iterator durch std::vector ersetzen, sortiert sie nach Bedarf (und möglicherweise mit std::set und Einfügung, um sie vor der Einführung sortiert zu halten) oder zu verwenden std::vector .

    
James Kanze 06.02.2012, 13:52
quelle
11
%Vor%

Der letzte Parameter sollte ein Ausgabe-Iterator sein. In Ihrem Fall ist es nicht, noch mehr, es ist unveränderlich (bc.% Co_de% hat unveränderliche Elemente). Sie sollten stattdessen einen insert_iterator verwenden:

%Vor%     
jpalecek 06.02.2012 13:46
quelle
8

res_set.begin() kann aus zwei Gründen nicht als Ausgabeargument von set_intersection verwendet werden:

  • Die Menge ist leer, und dies würde versuchen, vorhandene Elemente der Menge zu überschreiben
  • Sie können Elemente eines Sets nicht ändern.

Stattdessen möchten Sie ein insert_iterator , um die neuen Elemente in die Menge einzufügen:

%Vor%     
Mike Seymour 06.02.2012 13:48
quelle

Tags und Links