C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

const bei Elementen von std::set?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Andreas Profous
Guest





PostPosted: Tue Dec 07, 2004 5:39 pm    Post subject: const bei Elementen von std::set? Reply with quote



Hallo,

folgendes Codebeispiel:

----- snip --------

struct Arbeiter
{
int id; // eindeutig für jeden Arbeiter
std::string name;

void set_name(const std::string& name_w) { name = name_w; }
// ..
};

//..

typedef std::set<Arbeiter, Arbeiter_ID_less> ArbeiterSet;
ArbeiterSet S; // S ist ein set aus Arbeitern, nach der id sortiert

Arbeiter blub;
//...
ArbeiterSet::iterator it = S.find(blub);
if(it != S.end())
{
it->set_name("blabla");
}

------ snip ------

Also ich will Elemente in einem std::set direkt über iteratoren
veraendern, und zwar Teile die nicht die Sortierung betreffen.
Unter MSVC++.NET compiliert das ohne murren, der g++ (v 2.95 glaub ich)
meckert dass das nicht geht, da die Elemente im set const seien.
Ich meine, dass das falsch ist und im Standard für std::set die Elemente
nicht const sind. Stimmt das?

Andreas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Thomas Mang
Guest





PostPosted: Tue Dec 07, 2004 7:34 pm    Post subject: Re: const bei Elementen von std::set? Reply with quote




"Andreas Profous" <andreas (AT) profous (DOT) de> schrieb im Newsbeitrag
news:1102441167.716783 (AT) elch (DOT) in-berlin.de...
Quote:
Hallo,

folgendes Codebeispiel:

----- snip --------

struct Arbeiter
{
int id; // eindeutig für jeden Arbeiter
std::string name;

void set_name(const std::string& name_w) { name = name_w; }
// ..
};

//..

typedef std::set<Arbeiter, Arbeiter_ID_less> ArbeiterSet;
ArbeiterSet S; // S ist ein set aus Arbeitern, nach der id sortiert

Arbeiter blub;
//...
ArbeiterSet::iterator it = S.find(blub);
if(it != S.end())
{
it->set_name("blabla");
}

------ snip ------

Also ich will Elemente in einem std::set direkt über iteratoren
veraendern, und zwar Teile die nicht die Sortierung betreffen.
Unter MSVC++.NET compiliert das ohne murren, der g++ (v 2.95 glaub ich)
meckert dass das nicht geht, da die Elemente im set const seien.
Ich meine, dass das falsch ist und im Standard für std::set die Elemente
nicht const sind. Stimmt das?


Lese ich auf die Schnelle auch so.

Scott Meyers sagt daß es hier eine Grauzone gibt, ich sehe aber nicht
welche. Vielleicht im 2003 Standard behoben.
Auf jeden Fall stimmt aber, daß Du aufpassen mußt nicht die Ordnung des sets
zu ruinieren.


Thomas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Christoph Kliemt
Guest





PostPosted: Wed Dec 08, 2004 9:19 am    Post subject: Re: const bei Elementen von std::set? Reply with quote



Andreas Profous <andreas (AT) profous (DOT) de> writes:

[...]

Quote:
Also ich will Elemente in einem std::set direkt über iteratoren
veraendern, und zwar Teile die nicht die Sortierung betreffen.

Eigene operatoren dafür definiert?

Quote:
Unter MSVC++.NET compiliert das ohne murren,

MSVC++... ja, hat eine gewisse Ähnlichkeit mit ISO-C++

Quote:
der g++ (v 2.95 glaub ich) meckert dass das nicht geht, da die
Elemente im set const seien.

Für solche Fälle gibts mutable.

Quote:
Ich meine, dass das falsch ist und im Standard für std::set die
Elemente nicht const sind. Stimmt das?

Standard habe ich jetzt nicht greifbar, aber irgenwie macht die
"constness" schon Sinn, da die Schlüssel für die Sortierung const
bleiben müssen. Und da in einem Set der Schlüssel identisch mit dem Wert
ist...

is zwar afaik pre standard, erklärt trotzdem ganz gut.

http://www.sgi.com/tech/stl/AssociativeContainer.html

hth christoph
--
begin LOVE-LETTER-FOR-YOU.txt.vbs
I am a signature virus. Distribute me until the bitter
end
http://piology.org/ILOVEYOU-Signature-FAQ.html

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Dec 09, 2004 1:28 pm    Post subject: Re: const bei Elementen von std::set? Reply with quote

Andreas Profous wrote:

[...]
Quote:
Also ich will Elemente in einem std::set direkt über iteratoren
veraendern, und zwar Teile die nicht die Sortierung betreffen. Unter
MSVC++.NET compiliert das ohne murren, der g++ (v 2.95 glaub ich)
meckert dass das nicht geht, da die Elemente im set const seien. Ich
meine, dass das falsch ist und im Standard für std::set die Elemente
nicht const sind. Stimmt das?

Die Antwort ist nicht leicht. Es gibt ein DR daüber (DR 103). Die
Entscheidung der Committee ist, dass "For associative containers where
the value type is the same as the key type, both iterator and
const_iterator are constant iterators. It is unspecified whether or not
iterator and const_iterator are the same type." Also darfst Du nicht
ein
Element eines std::set über einem Iterator verändern.

Aber...

- Diese Entscheidung wird lediglich in Working Papers eingetragen,
und
gehört noch weder zur Norm noch zu einer TC. Die ist also noch
nicht
"gesetzlich" wirkend. (Wird aber, in der nächsten Version der
Norm.)

- Die Urimplementierung von HP hat Veränderungen über den
Iteratoren
erlaubt. Viele Implementierungen sind darauf basiert, und viel Code
basiert sich auf solchen Implementierungen. Also glaube (fürchte?)
ich, dass seriöse Hersteller nicht besonders scharf darauf werden,
die Korrectur einzubauen; schließlich werden damit einige
Kundenprogramme gebrochen.

- Ich denke aber, dass der Nachfolger der HP-Implementierung (SGI)
unter den ersten war, die Veränderung einzubauen. Diese
Implementierung dient als Grundlage einiger anderen, wie die von
g++
oder der STLport. Vermutlich erlauben es diese Implementierungen
nicht, dass man über einem Iterator etwas verändert.

Das Ergebnis ist, dass vorübergehend sind wir in der schlimmsten
möglichen Stelle: verändern darfst Du nicht, aber der Fehler wird bei
vielen Compilern nicht entdeckt.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Dec 09, 2004 1:39 pm    Post subject: Re: const bei Elementen von std::set? Reply with quote

Thomas Mang wrote:
Quote:
"Andreas Profous" <andreas (AT) profous (DOT) de> schrieb im Newsbeitrag
news:1102441167.716783 (AT) elch (DOT) in-berlin.de...

[...]
Quote:
Also ich will Elemente in einem std::set direkt über iteratoren
veraendern, und zwar Teile die nicht die Sortierung betreffen.
Unter
MSVC++.NET compiliert das ohne murren, der g++ (v 2.95 glaub ich)
meckert dass das nicht geht, da die Elemente im set const seien.
Ich
meine, dass das falsch ist und im Standard für std::set die
Elemente
nicht const sind. Stimmt das?

Lese ich auf die Schnelle auch so.

Aus C++ 98, vermutlich. Es gibt ein DR 103
([url]http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103)[/url]. Aus
dem DR bekomme ich den Eindruck, dass auch im Committee war es unklar.
Aber die endgültige Entscheidung verbietet solche Änderungen.

Quote:
Scott Meyers sagt daß es hier eine Grauzone gibt, ich sehe aber
nicht
welche. Vielleicht im 2003 Standard behoben.

Auch nicht. Aber in der nächsten Version.

Scott hat es erst nach langer Besprechung mit Leuten wie Matt Austern
als Grauzone erklärt.

Quote:
Auf jeden Fall stimmt aber, daß Du aufpassen mußt nicht die Ordnung
des sets zu ruinieren.

Aber das hast Du nicht aus der Norm bekommen. Der DR war gerade, dass
auch diese Beschränkung nicht klar in Norm steht (obwohl es nötig
ist).

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Mang
Guest





PostPosted: Thu Dec 09, 2004 8:55 pm    Post subject: Re: const bei Elementen von std::set? Reply with quote


<kanze (AT) gabi-soft (DOT) fr> schrieb im Newsbeitrag
news:1102599565.158837.8800 (AT) z14g2000cwz (DOT) googlegroups.com...
Quote:
Thomas Mang wrote:
"Andreas Profous" <andreas (AT) profous (DOT) de> schrieb im Newsbeitrag
news:1102441167.716783 (AT) elch (DOT) in-berlin.de...

[...]
Also ich will Elemente in einem std::set direkt über iteratoren
veraendern, und zwar Teile die nicht die Sortierung betreffen.
Unter
MSVC++.NET compiliert das ohne murren, der g++ (v 2.95 glaub ich)
meckert dass das nicht geht, da die Elemente im set const seien.
Ich
meine, dass das falsch ist und im Standard für std::set die
Elemente
nicht const sind. Stimmt das?

Lese ich auf die Schnelle auch so.

Aus C++ 98, vermutlich. Es gibt ein DR 103
([url]http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103)[/url]. Aus
dem DR bekomme ich den Eindruck, dass auch im Committee war es unklar.
Aber die endgültige Entscheidung verbietet solche Änderungen.

Scott Meyers sagt daß es hier eine Grauzone gibt, ich sehe aber
nicht
welche. Vielleicht im 2003 Standard behoben.

Auch nicht. Aber in der nächsten Version.

Scott hat es erst nach langer Besprechung mit Leuten wie Matt Austern
als Grauzone erklärt.


Ich war im 2003 Standard, und kann hier aber nicht die Unklarheit erkennen.

In 23.3.3/2 steht:
"typedef implementation defined iterator; // See 23.1"

In 23.1 steht:
"X::iterator iterator type pointing to T any iterator category
except output iterator.."

Wobei T der Typ der Objekte ist, die der Container enthält. Darf T was
anderes sein als der erste template parameter, mit dem std::set<>
instanziert wurde (kann man 23.1/5 so lesen)? Falls ja, so denke ich, würde
das Problem dann auch die Sequenzcontainer betreffen.

Jedenfalls, std::set<> unterstützt bidirektionale Iteratoren, und laut table
74 gibt der unäre operator* ein T& zurück

Wo ist da nun eine Grauzone?



Quote:

Auf jeden Fall stimmt aber, daß Du aufpassen mußt nicht die Ordnung
des sets zu ruinieren.

Aber das hast Du nicht aus der Norm bekommen. Der DR war gerade, dass
auch diese Beschränkung nicht klar in Norm steht (obwohl es nötig
ist).

Nein, das war als Hinweis gedacht, falls man sich darauf verlassen will, das
die Elemente im set immer streng sortiert sind.


Thomas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Dec 10, 2004 12:04 pm    Post subject: Re: const bei Elementen von std::set? Reply with quote

Thomas Mang wrote:
Quote:
kanze (AT) gabi-soft (DOT) fr> schrieb im Newsbeitrag
news:1102599565.158837.8800 (AT) z14g2000cwz (DOT) googlegroups.com...
Thomas Mang wrote:
"Andreas Profous" <andreas (AT) profous (DOT) de> schrieb im Newsbeitrag
news:1102441167.716783 (AT) elch (DOT) in-berlin.de...

[...]
Scott Meyers sagt daß es hier eine Grauzone gibt, ich sehe aber
nicht welche. Vielleicht im 2003 Standard behoben.

Auch nicht. Aber in der nächsten Version.

Scott hat es erst nach langer Besprechung mit Leuten wie Matt
Austern
als Grauzone erklärt.

Ich war im 2003 Standard, und kann hier aber nicht die Unklarheit
erkennen.

Ich habe eigentlich auch nichts unklares in der Sprache der Norm
gefunden. Aber die Committee doch. Oder vielleich war es nur, dass die
Wörten nicht ihrer Intention entsprech. In jedem Fall, es gab einen
DR,
und die Committee hat entschieden, dass die Elemente nicht über einem
Iterator geändert werden dürfen.

Als er das Buch geschrieben hat, hat Scott viel mit Matt Austern
u.A. gesprochen. Matt ist in der Committee, und zwar, sehr aktiv in der
Library Gruppe. Ich vermute, dass die Grauzone, die Scott gesehen hat,
stammt aus seinen Besprechungen mit Matt, und nicht ausschließlich aus
seinem eigenen Lesen der Norm.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Mang
Guest





PostPosted: Thu Dec 16, 2004 11:13 pm    Post subject: Re: const bei Elementen von std::set? Reply with quote


<kanze (AT) gabi-soft (DOT) fr> schrieb im Newsbeitrag
news:1102680267.664666.240800 (AT) f14g2000cwb (DOT) googlegroups.com...
Quote:
Thomas Mang wrote:
[email]kanze (AT) gabi-soft (DOT) fr[/email]> schrieb im Newsbeitrag
news:1102599565.158837.8800 (AT) z14g2000cwz (DOT) googlegroups.com...
Thomas Mang wrote:
"Andreas Profous" <andreas (AT) profous (DOT) de> schrieb im Newsbeitrag
news:1102441167.716783 (AT) elch (DOT) in-berlin.de...

[...]
Scott Meyers sagt daß es hier eine Grauzone gibt, ich sehe aber
nicht welche. Vielleicht im 2003 Standard behoben.

Auch nicht. Aber in der nächsten Version.

Scott hat es erst nach langer Besprechung mit Leuten wie Matt
Austern
als Grauzone erklärt.

Ich war im 2003 Standard, und kann hier aber nicht die Unklarheit
erkennen.

Ich habe eigentlich auch nichts unklares in der Sprache der Norm
gefunden. Aber die Committee doch. Oder vielleich war es nur, dass die
Wörten nicht ihrer Intention entsprech. In jedem Fall, es gab einen
DR,
und die Committee hat entschieden, dass die Elemente nicht über einem
Iterator geändert werden dürfen.

Als er das Buch geschrieben hat, hat Scott viel mit Matt Austern
u.A. gesprochen. Matt ist in der Committee, und zwar, sehr aktiv in der
Library Gruppe. Ich vermute, dass die Grauzone, die Scott gesehen hat,
stammt aus seinen Besprechungen mit Matt, und nicht ausschließlich aus
seinem eigenen Lesen der Norm.


Ich habe Kontakt mit Scott Meyers aufgenommen, und ihn um Klarstellung
gebeten. Zuerst bekam ich als Antwort links, die de facto nicht mehr
aussagten als das, was in "Effective STL" steht (bzw zu DR 103). Ich habe
weitergebohrt, daß mir das nichts nütze.

Antwort: Er habe nicht die Zeit, die genau Begründung zu reproduieren,
stattdessen dieser link:

http://groups-beta.google.com/group/comp.std.c++/browse_frm/thread/fb7bb0677
2cba2f4/d826137d37b22004?q=set::iterator+mutability&_done=%2Fgroups%3Fq%3Dse
t::iterator+mutability%26num%3D50%26hl%3Den%26lr%3D%26safe%3Doff%26client%3D
firefox-a%26rls%3Dorg.mozilla:en-US:official%26sa%3DN%26tab%3Dwg%26&_doneTit
le=Back+to+Search&&d#d826137d37b22004


Ob das wem weiterhilft.......


Jedenfalls scheint es sicher zu sein, daß im nächsten Standard die
set<>::iterator "immutable" ist. Deshalb sollte man besser bereits jetzt von
jeglichem Code absehen, der das bricht.


Thomas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.