Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ein paar Fragen zur Geschichte und TR1

2 views
Skip to first unread message

Olaf Krzikalla

unread,
Sep 1, 2009, 4:03:30 AM9/1/09
to
Hallo allerseits,

ich hab mal ein paar Fragen zu Begrifflichkeiten. Fangen wir bei der
Geschichte der Standard-Bibliothek von C++98 an: AFAIK gilt
Standard-Bibliothek = STL + C-Bibliothek + Epsilon.
1.Frage: was enthᅵlt Epsilon? Oder ist Epsilon 0? Waren Streams schon
Teil der STL?

2.Frage: ist TR1 normativ? Man findet im Netz einige Aussagen, nach
denen TR1 nicht wirklich Teil des Standards ist - das hat mich etwas
verwirrt.

3.Frage (jetzt mal was technisches):

void foo(int* intptr, size_t size)
{
using namespace std::tr1;
using namespace std::tr1::placeholders;
std::set<int> bar;
std::for_each(intptr, intptr + size,
bind(std::set<int>::insert, ref(bar), _1));
}

Im Prinzip geht es nur um das insert, das da oben ja nicht funktioniert.
Um den Overload fᅵr bind aufzulᅵsen, mᅵᅵte man statisch casten. Ich
erspare mir und den Mitlesenden, diesen cast jetzt hier hinzuschreiben.
Momentan behelfe ich mir in solchen Fᅵllen mit einer globalen
selbstgeschriebenen insert_ele - Funktion. Kennt da jemand was
schᅵneres? Evtl. auch erst in C++0x?

MfG
Olaf Krzikalla

Daniel Krügler

unread,
Sep 1, 2009, 5:39:25 PM9/1/09
to
On 1 Sep., 10:03, Olaf Krzikalla <krzika...@gmx.de> wrote:
> ich hab mal ein paar Fragen zu Begrifflichkeiten. Fangen wir bei der
> Geschichte der Standard-Bibliothek von C++98 an: AFAIK gilt
> Standard-Bibliothek = STL + C-Bibliothek + Epsilon.
> 1.Frage: was enthält Epsilon? Oder ist Epsilon 0? Waren Streams schon
> Teil der STL?

Zuerst einmal enthält der C++ Standard *keinen* Teil, der offiziell
"STL"
heisst, aber dazu später. Wie viele andere Standards auch, bezieht
sich der C++-Standard auf einen Satz anderer Standards im nomativen
Sinn. Im 1998-Standard waren dies

- ISO/IEC 2382 (Technisches Vokabular)
- ISO/IEC 9899:1990 + ISO/IEC 9899/Amd.1:1995 (Der damalige C-Standard
"1990")
- ISO/IEC 106461:1993 (Multibyte-Charaktersätze, UCS)

Insbesondere werden bestimmte Abschnitte des C-Standards mit dem
Begriff "Standard C Library" assoziiert. Des weiteren beschreibt die
zweite
Hälfte des Dokumentes die sog. "C++ Standard Library", diese gliedert
sich
in bestimmte Hauptabschnitte (im Englischen "clauses"):

Language Support library (Exceptions, numeric Limits, type info, etc.)
Diagnostics library (Exceptionklassen, Error-Codes)
General Utilities library (pair, functional, memory, etc)
Strings library (irgendwie klar, oder?)
Localization library (locales zur Formattierung, Sortierung, etc.)
Containers library (vector, map, ...)
Iterators library (Iteratorkategorien, reverse_iterator, etc.)
Algorithms library (auch irgendwie klar, nehme ich an)
Numeric library (valarray, complex)
Input/output library (IO streams und Co)

Die zuletztgenannte Library enthielt von 1998 an Streams in der
templatisierten Form, davor gab es die noch Vor-Standard-Nicht-
Template-Libs, wo z.B. ostream kein typedef für eine bestimmte
Template-Spezialisierung, sondern eine 'normale' Klasse war.

Das häufig verwendete Akronym STL steht für Standard Template
Library, aber der C++ Standard verwendet *weder* die Abkürzung
noch den Namen. Üblicherweise versteht man darunter ganz grob
die Container library und die Algorithms library, wobei nicht gross
unterschieden wird, ob man auch z.B. die Numeric library dazuzählt
oder nicht. Dieser inoffizielle Begriff ist aber schon recht alt,
siehe
z.B.

http://de.wikipedia.org/wiki/Standard_Template_Library

> 2.Frage: ist TR1 normativ? Man findet im Netz einige Aussagen, nach
> denen TR1 nicht wirklich Teil des Standards ist - das hat mich etwas
> verwirrt.

Das TR1-Dokument - genauer: ISO/IEC TR 19768: C++ Library
Extensions TR1 - wurde vom Kommittee des C++ Standards erstellt,
es ist aber *nicht* im strengen Sinne normativ - im Gegensatz zum
C++ Standard ISO/IEC 14882 und dessen Nachfolger ISO/IEC
14882:2003(E).
Es handelt um eine technischen Report, wobei es in der Realität so
ist, dass ihr Inhalt eine typischerweise recht grosse Chance hat, in
einem
zukünftigeren Standard übernommen zu werden. Der letzte Draft des
TR1-Dokumentes findet sich unter

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

Ein ähnliches Beispiel für ein derartiges technisches
Weisungsdokument
ist ISO/IEC TR 24733 C++ decimal floating point arithmetic extensions,
dessen letzte Draft-Version zu finden ist unter

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2849.pdf

> 3.Frage (jetzt mal was technisches):
>
> void foo(int* intptr, size_t size)
> {
> using namespace std::tr1;
> using namespace std::tr1::placeholders;
> std::set<int> bar;
> std::for_each(intptr, intptr + size,
> bind(std::set<int>::insert, ref(bar), _1));
>
> }
>
> Im Prinzip geht es nur um das insert, das da oben ja nicht funktioniert.

> Um den Overload für bind aufzulösen, müßte man statisch casten. Ich


> erspare mir und den Mitlesenden, diesen cast jetzt hier hinzuschreiben.

> Momentan behelfe ich mir in solchen Fällen mit einer globalen


> selbstgeschriebenen insert_ele - Funktion. Kennt da jemand was

> schöneres? Evtl. auch erst in C++0x?

In C++0x mit Hilfe eines Lambda-Ausdrucks:

void foo(int* intptr, size_t size)
{

std::set<int> bar;
std::for_each(intptr, intptr + size, [&](int n) { bar.insert
(n); });
}

Besten Gruss aus Bremen,

Daniel Krügler

0 new messages