Mengenlehre mit der STL

Post Reply
Message
Author
Bob+Gomorrha

Mengenlehre mit der STL

#1 Post by Bob+Gomorrha »

Folgendes Progrämmchen funktioniert unter Mandrake 9.2 mit gcc 2.95.3:

#include <iostream>
#include <string>
#include <set>
#include <algorithm>

void main() {

// make the elements that will go into the sets
string Str1("string1");
string Str2("string2");
string Str3("string3");

// make set variables
set<string> A;
set<string> B;
set<string> C;

// use the insert operator to
A.insert(Str1);
A.insert(Str2);
B.insert(Str2);
B.insert(Str3);

set<string>::iterator P = A.begin();
while( P != A.end() ) {
cout << "Set A has element " << *P << endl;
P++;
}

cout << endl;

P = B.begin();
while( P != B.end() ) {
cout << "Set B has element " << *P << endl;
P++;
}

cout << endl;

// Make a set that is the union of two sets
set_union( A.begin(), A.end(),
B.begin(), B.end(),
inserter( C, C.begin() ));

P = C.begin();
while( P != C.end() ) {
cout << "Set A union B has element " << *P << endl;
P++;
}

// empty the set variable
C.clear();

cout << endl;

// Make a set that is the intersection of two sets
set_intersection( A.begin(), A.end(),
B.begin(), B.end(),
inserter( C, C.begin() ));

P = A.begin();

//cout << count(A.begin(), A.end() );

P = C.begin();
while( P != C.end() ) {
cout << "Set A interset B has element " << *P << endl;
P++;
}

// empty the set variable
C.clear();

cout << endl;

// Make a set that has elements in A which are not in B
set_difference( A.begin(), A.end(),
B.begin(), B.end(),
inserter( C, C.begin() ));

P = C.begin();
while( P != C.end() ) {
cout << "Set A-B has element " << *P << endl;
P++;
}

// empty the set variable
C.clear();

cout << endl;

// Make a set that has elements in B which are not in A
set_difference( B.begin(), B.end(),
A.begin(), A.end(),
inserter( C, C.begin() ));

P = C.begin();
while( P != C.end() ) {
cout << "Set B-A has element " << *P << endl;
P++;
}

// now eliminate Str1 from A
A.erase(Str1);

cout << endl;

P = A.begin();
while( P != A.end() ) {
cout << "Set A (after erasing String1) has element " << *P << endl;
P++;
}
}





Nach der Schnittmenge ( set_intersection ) wurde von mir eingefügt (im Listing auskommentiert):

cout << count(A.begin(),A.end() );

Beim Compilieren meint g++: no matching function call to count... usw.

Meine Frage/Wunsch nun: Wie berechne ich die Anzahl der Elemente in Menge A?

Dank schon mal im Voraus

bg

Descartes

Re: Mengenlehre mit der STL

#2 Post by Descartes »

1.) "namespace std;" fehlt
2.) "void main()" ist keine korrekte Main-Funktion; main() muss einen Return-Wert liefern
3.) "count()" benötigt drei Parameter, nicht zwei:

template <class InIter, class T>
difference_type count(InIter start, InIter finish, const T& value);

<a href="http://www.halpernwightsoftware.com/std ... ckref.html" target="_blank"><!--auto-->http://www.halpernwightsoftware.com/std ... <!--auto-->

Bob Gomorrha

Re: Mengenlehre mit der STL

#3 Post by Bob Gomorrha »

Vorab Dank! Bin der Sache näher aber noch nicht ganz dort, wo ich hinwill.

Meine "Suchzeilen" schauen jetzt so aus:

P = C.begin(); // Iterator auf Anfang der Schnittmenge
string das_suche_ich ("string2"); // das_suche_ich soll nach string2 suchen
cout << count(C.begin(), C.end(), das_suche_ich ) << endl; // und das Ergebnis ausgeben.

Die Ausgabe ist korrekt, die untersuchte Schnittmenge C besteht aus dem Element string2, es wird folglich eine 1 ausgegeben.

Meine Frage nun ist die: Ich will nicht gezielt die Anzahl gewisser Elemente wissen, sondern nur wieviele Elemente sich überhaupt in dieser Menge befinden.
So eine Art Jokerzeichen, da ich ja im Fall grösserer Mengen und unbekannter Inhalte nicht jede Möglichkeit abfragen möchte.

Dank wie immer!

bg

Descartes

Re: Mengenlehre mit der STL

#4 Post by Descartes »

> Meine Frage nun ist die: Ich will nicht gezielt die Anzahl gewisser Elemente wissen, sondern nur wieviele
> Elemente sich überhaupt in dieser Menge befinden.

Ein "set" besitzt hierfür die Instantzfunktion "size()".
Mach' also:
std::cout << "Anzahl Elemente im Set: " << A.size() << std::endl;

Descartes

Re: Mengenlehre mit der STL

#5 Post by Descartes »

>
> Folgendes Progrämmchen funktioniert unter Mandrake 9.2 mit gcc 2.95.3:
>
Insbesondere wenn du C++ programmierst, solltest du einen Wechsel zu einem aktuellen gcc 3.3.* Compiler in Betracht ziehen. Im Gegensatz zu den 2.95er Versionen unterstützt die 3er Version des Compiler den C++ Standard besser.

Bob Gomorrha

Re: Mengenlehre mit der STL

#6 Post by Bob Gomorrha »

Mächtig Codegut!!!

Vorab - mit size() - funktioniert die Gschicht so wie ich es wollte.

Bzgl. gcc 3er Serie: Habe zu Anfang versucht, diese Zeilen mit dem standardmässig installieren gcc 3er von Mandrake zu kompilieren.
Dies hatte leider mehr warnings als Programmzeilen zur Folge.

Bzgl. Umstieg auf 3er Serie wg. Standards: Würd ich gern, nur sind anscheinend meine Online-Tutorials schon so veraltet, dass
der grösste Teil der Beispiele nicht compiliert. Dies beginnt schon bei den include-Datein. Deswegen hab ich bisher alle meine
Beispiele mit dem Flag -Wno-deprecated übersetzt. Ausserdem code ich "just for fun" - so gesehen zählt für micht mehr das Resultat denn
der Standard.

Sollte es allerdings irgendwo ein brauchbares STL-Kompendium im Netz zu finden sein (kann auch Engslish sein), wäre dies sehr hilfreich.
Die bisherige 20-seitige Google-Suche war leider entweder zu spezifisch oder zu oberflächlich.

Aber wie gesagt - mein Problem ist gelöst! - Schönen Sonntag noch und Dank!!!

bg

PS: Es darf (von wegen "wir lernen STL" ) auch ein PL-Workshop sein <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Descartes

Re: Mengenlehre mit der STL

#7 Post by Descartes »

> zgl. Umstieg auf 3er Serie wg. Standards:
> Würd ich gern, nur sind anscheinend meine Online-Tutorials schon so veraltet, dass
> der grösste Teil der Beispiele nicht compiliert. Dies beginnt schon bei den include-Datein.
> Deswegen hab ich bisher alle meine Beispiele mit dem Flag -Wno-deprecated übersetzt.
>
Das beweist nur, dass dies betreffenden Tutorials schon vorher -- aus Standard Sicht -- nicht so der Bringer waren. Nur hat's halt vorher keiner gemerkt weil der gcc (aber auch andere Compiler z.B. VisualC++) viele falsche Konstrukte einfach erlaubt hat.

Wenn du in einem Buch oder Tutorial jemanden C++ Header mit Dateiendung inkludieren siehst (z.B. #include <iostream.h>) oder gar dass die main() Routine falsch angegeben wird (void main()) dann wirf das Buch / Tutorial so weit weg wie du kannst -- es taugt nix. Auch unter Berücksichtigung, dass der C++ Standard bisweilen z.B. iostream.h Header (mit Dateiendung *.h) beschrieben hat beweist nur, dass das Buch/Tutorial seit Ende 1997 -- damals wurde der C++ Standard verabschiedet -- nicht mehr an den aktuell gültigen C++ Standard angepasst wurde.

> Ausserdem code ich "just for fun" -- so gesehen zählt für micht mehr das Resultat denn der Standard.
>
Die Ausrede lasse ich jetzt nicht gelten -- oder programmierst du deine C Programme auch in K&R C?

> Bzgl. gcc 3er Serie:
> Habe zu Anfang versucht, diese Zeilen mit dem standardmässig installieren gcc 3er
> von Mandrake zu kompilieren. Dies hatte leider mehr warnings als Programmzeilen zur Folge.
>
Das ist ein Indix darauf, dass dein Quellcode nicht standardkonform ist.
Deinen Quellcode habe ich mal angepasst und bei mir compiliert er mit dem gcc 3.3 ohne jegliche Warning.

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <iostream>
#include <string>
#include <set>
#include <algorithm>

int main()
{
// make the elements that will go into the sets
std::string Str1("string1");
std::string Str2("string2");
std::string Str3("string3");

// make set variables
std::set<std::string> A;
std::set<std::string> B;
std::set<std::string> C;

// use the insert operator to
A.insert(Str1);
A.insert(Str2);
B.insert(Str2);
B.insert(Str3);

std::set<std::string>::iterator P = A.begin();
while( P != A.end() )
{
std::cout << "Set A has element " << *P << std::endl;
P++;
}
std::cout << std::endl;

P = B.begin();
while( P != B.end() )
{
std::cout << "Set B has element " << *P << std::endl;
P++;
}
std::cout << std::endl;

// Make a set that is the union of two sets
set_union( A.begin(), A.end(), B.begin(), B.end(), inserter( C, C.begin() ));

P = C.begin();
while( P != C.end() )
{
std::cout << "Set A union B has element " << *P << std::endl;
P++;
}
std::cout << std::endl;

// empty the set variable
C.clear();

// Make a set that is the intersection of two sets
set_intersection( A.begin(), A.end(), B.begin(), B.end(), inserter( C, C.begin() ));
P = A.begin();

// std::cout << count(A.begin(), A.end() );
// std::cout << "DEBUG: " << count(A.begin(), A.end(), std::string("string1")) << std::endl;
std::cout << "DEBUG: " << A.size() << std::endl;

P = C.begin();
while( P != C.end() )
{
std::cout << "Set A interset B has element " << *P << std::endl;
P++;
}
std::cout << std::endl;

// empty the set variable
C.clear();

// Make a set that has elements in A which are not in B
set_difference( A.begin(), A.end(), B.begin(), B.end(), inserter( C, C.begin() ));

P = C.begin();
while( P != C.end() )
{
std::cout << "Set A-B has element " << *P << std::endl;
P++;
}
std::cout << std::endl;

// empty the set variable
C.clear();

// Make a set that has elements in B which are not in A
set_difference( B.begin(), B.end(), A.begin(), A.end(), inserter( C, C.begin() ));

P = C.begin();
while( P != C.end() )
{
std::cout << "Set B-A has element " << *P << std::endl;
P++;
}
std::cout << std::endl;

// now eliminate Str1 from A
A.erase(Str1);

P = A.begin();
while( P != A.end() )
{
std::cout << "Set A (after erasing String1) has element " << *P << std::endl;
P++;
}
return 0;
}
</font><hr></pre></blockquote>

Bob Gomorrha

Re: Mengenlehre mit der STL

#8 Post by Bob Gomorrha »

Nun gut denn - die Argumentation ist ja so unrichtig nicht.

Ich hab mir jetzt mal einige Schwarten zugelegt:

Addison/Wesley - The C++ Standard Library
Standard Template Library Programmers Guide von SGI
Programming C++ - International Standard

Irgenwie schaut es ja doch ästhetischer aus. Deine angepasste Version kompiliert übrigens auch bei mir ohne Meldung.

Dank nochmal und Gruss!

bg

Post Reply