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 

remove_copy problem

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





PostPosted: Wed Mar 01, 2006 4:06 pm    Post subject: remove_copy problem Reply with quote



Mein neuester Compiler meldet einen Fehler in std::remove_copy aus
<algorithm>. Ich benutze diese Funktion gar nicht, aber scheinbar wird
sie von einer anderen Funktion aufgerufen. Der Fehler betrifft die Zeile:

*_Dest++ = *_First;

und lautet:

[C++ Fehler] algorithm(576): E2024 const-Objekt kann nicht modifiziert
werden

Die Funktion ist wie folgt implementiert:

// TEMPLATE FUNCTION remove_copy_if
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
{ // copy omitting each element satisfying _Pred
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Pred);
for (; _First != _Last; ++_First)
if (!_Pred(*_First))
*_Dest++ = *_First;
return (_Dest);

Hat jemand eine Idee, was hier schiefgeht, bzw., was ich möglicherweise
falsch mache?

Markus

--
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
Rolf Magnus
Guest





PostPosted: Wed Mar 01, 2006 5:06 pm    Post subject: Re: remove_copy problem Reply with quote



Markus Pesti wrote:

Quote:
Mein neuester Compiler meldet einen Fehler in std::remove_copy aus
algorithm>. Ich benutze diese Funktion gar nicht, aber scheinbar wird
sie von einer anderen Funktion aufgerufen.

Von welcher denn? Normalerweise sollte der Compiler dir das mitteilen oder
zumindest, mit welchen Template-Argumenten remove_copy_if instanziiert
wurde. Das wäre nämlich recht hilfreich, um zu wissen, von welchem Typ denn
_Dest und _First sind.

Quote:
Der Fehler betrifft die Zeile:

*_Dest++ = *_First;

und lautet:

[C++ Fehler] algorithm(576): E2024 const-Objekt kann nicht modifiziert
werden

Die Funktion ist wie folgt implementiert:

// TEMPLATE FUNCTION remove_copy_if
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred)
{ // copy omitting each element satisfying _Pred
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Pred);
for (; _First != _Last; ++_First)
if (!_Pred(*_First))
*_Dest++ = *_First;
return (_Dest);

Hat jemand eine Idee, was hier schiefgeht, bzw., was ich möglicherweise
falsch mache?

Nicht, wenn du nicht zeigst, was du überhaupt machst.

--
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
Markus Pesti
Guest





PostPosted: Wed Mar 01, 2006 5:06 pm    Post subject: Re: remove_copy problem Reply with quote



Ich bin dem Problem inzwischen etwas näher gekommen. remove_copy_if wird
von remove_if aufgerufen. Reduziert auf die eigentliche Stelle folgendes
Beispiel:

#include <set>
#include <functional>
#include <algorithm>

class key_list
{
std::set<int> pr;

template<class T>
class not_in_raster : public std::unary_function<T, bool>
{
T rc;
public:
not_in_raster(const T& c) : rc(c) { }
bool operator() (const T& x) { return x%rc; }
};

void key_list::remove_keys_not_in_raster(int raster)
{
pr.erase(std::remove_if(pr.begin(), pr.end(),
not_in_raster<int>(raster)), pr.end());
}
};

Offensichtlich wird mein pr.begin() irgendwie zu einem konstanten
Objekt. Ich sehe nur nicht so richtig warum.

Markus


Markus Pesti wrote:
Quote:
Mein neuester Compiler meldet einen Fehler in std::remove_copy aus
algorithm>. Ich benutze diese Funktion gar nicht, aber scheinbar wird
sie von einer anderen Funktion aufgerufen. Der Fehler betrifft die Zeile:

*_Dest++ = *_First;

und lautet:

[C++ Fehler] algorithm(576): E2024 const-Objekt kann nicht modifiziert
werden

Die Funktion ist wie folgt implementiert:

// TEMPLATE FUNCTION remove_copy_if
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pr
_Pred)
{ // copy omitting each element satisfying _Pred
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Pred);
for (; _First != _Last; ++_First)
if (!_Pred(*_First))
*_Dest++ = *_First;
return (_Dest);

Hat jemand eine Idee, was hier schiefgeht, bzw., was ich möglicherweise
falsch mache?

Markus


--
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
Olaf Krzikalla
Guest





PostPosted: Wed Mar 01, 2006 7:06 pm    Post subject: Re: remove_copy problem Reply with quote

Hi,

Markus Pesti wrote:
Quote:
#include <set
#include <functional
#include <algorithm

class key_list
{
std::set<int> pr;

template<class T
class not_in_raster : public std::unary_function<T, bool
{
T rc;
public:
not_in_raster(const T& c) : rc(c) { }
bool operator() (const T& x) { return x%rc; }
};

void key_list::remove_keys_not_in_raster(int raster)
{
pr.erase(std::remove_if(pr.begin(), pr.end(),
not_in_raster<int>(raster)), pr.end());
}
};

Für ein set wird remove_xxx nicht gehen, da noch darüber gestritten
wird, ob der Inhalt einer in set gespeicherten Variablen überhaupt
verändert werden darf (da dadurch die Ordnung des set zerstört werden
kann). Jeder Lib-Hersteller hat da unabhängig vom Standard eigene
Tatsachen geschaffen.

MfG
Olaf Krzikalla

--
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
Markus Pesti
Guest





PostPosted: Thu Mar 02, 2006 11:06 am    Post subject: Re: remove_copy problem Reply with quote

Na das kann ich mir nicht vorstellen. Es muss doch möglich sein, aus
einem set Werte zu löschen, was würde dadurch zerstört werden?
Alternativ müsste ich dann eine list verwenden und nach jedem einfügen
von Elementen sort() aufrufen. Das kann's ja nicht sein. Außerdem
verstehe ich die Argumentation nicht. Ist es wirklich so, dass man aus
einem set keine Werte löschen darf?

Markus

Olaf Krzikalla wrote:
Quote:
Hi,


Für ein set wird remove_xxx nicht gehen, da noch darüber gestritten
wird, ob der Inhalt einer in set gespeicherten Variablen überhaupt
verändert werden darf (da dadurch die Ordnung des set zerstört werden
kann). Jeder Lib-Hersteller hat da unabhängig vom Standard eigene
Tatsachen geschaffen.

MfG
Olaf Krzikalla


--
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
Rolf Magnus
Guest





PostPosted: Thu Mar 02, 2006 12:06 pm    Post subject: Re: remove_copy problem Reply with quote

Bitte kein TOFU.

Markus Pesti wrote:

Quote:
Für ein set wird remove_xxx nicht gehen, da noch darüber gestritten
wird, ob der Inhalt einer in set gespeicherten Variablen überhaupt
verändert werden darf (da dadurch die Ordnung des set zerstört werden
kann). Jeder Lib-Hersteller hat da unabhängig vom Standard eigene
Tatsachen geschaffen.

Na das kann ich mir nicht vorstellen. Es muss doch möglich sein, aus
einem set Werte zu löschen, was würde dadurch zerstört werden?

remove_*() löscht das Element nicht, sondern schiebt es nur ans Ende des
Containers. Das geht bei einem set natürlich nicht, da dieses die Elemente
immer in sortierter Folge enthält.
Brauchst du die Sortierung denn? Für das remove_if ist es jedenfalls nicht
nützlich, da dafür ja eh _jedes_ Element gegen deine Bedingung geprüft
werden muß.

Quote:
Alternativ müsste ich dann eine list verwenden und nach jedem einfügen
von Elementen sort() aufrufen.

Brauchst du nicht unbedingt. Du kannst, wenn der Container bereits sortiert
ist, vor dem Einfügen über ein lower_bound() die passende Stelle zum
Einfügen finden, um die Sortierung zu erhalten. So ähnlich dürfte ein set
das auch machen.

Quote:
Das kann's ja nicht sein. Außerdem verstehe ich die Argumentation nicht.
Ist es wirklich so, dass man aus einem set keine Werte löschen darf?

Nein. Das erase() gibt's für set genauso wie für andere Container. Nur das
Verschieben von Elementen ist aufgrund der sortierten Natur eines set()
nicht möglich.

--
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
Markus Pesti
Guest





PostPosted: Thu Mar 02, 2006 3:06 pm    Post subject: Re: remove_copy problem Reply with quote

Rolf Magnus wrote:
Quote:
Bitte kein TOFU.

Sorry.

Quote:


remove_*() löscht das Element nicht, sondern schiebt es nur ans Ende des
Containers. Das geht bei einem set natürlich nicht, da dieses die Elemente
immer in sortierter Folge enthält.
Brauchst du die Sortierung denn? Für das remove_if ist es jedenfalls nicht
nützlich, da dafür ja eh _jedes_ Element gegen deine Bedingung geprüft
werden muß.

Ja, ich brauche es zwingend, wenn auch nicht des Löschens wegen.

Quote:

Alternativ müsste ich dann eine list verwenden und nach jedem einfügen
von Elementen sort() aufrufen.

Brauchst du nicht unbedingt. Du kannst, wenn der Container bereits sortiert
ist, vor dem Einfügen über ein lower_bound() die passende Stelle zum
Einfügen finden, um die Sortierung zu erhalten. So ähnlich dürfte ein set
das auch machen.

Das kann's ja nicht sein. Außerdem verstehe ich die Argumentation nicht.
Ist es wirklich so, dass man aus einem set keine Werte löschen darf?

Nein. Das erase() gibt's für set genauso wie für andere Container. Nur das
Verschieben von Elementen ist aufgrund der sortierten Natur eines set()
nicht möglich.


Okay, jetzt wird es wieder klar. Mir ist auch eingefallen, dass mein
Container ursprünglich wirklich eine list war. Er wurde erst später in
set geändert, weil es irgendwann zu unübersichtlich wurde, immer
überlegen zu müssen, wann sort() aufgerufen werden muss and wann nicht.

Und die Funktion 'remove_keys_not_in_raster', funktionierte mit dem
alten Compiler einfach für set weiter wie sie es vorher für list getan
hatte.

Jetzt also meine angepasste Version:

void key_list::remove_keys_not_in_raster(ilong raster)
{
for(std::set<ilong>::iterator p = pr.begin(); p != pr.end()Wink
if(*p%raster)
pr.erase(p++);
else
++p;
}

Markus

--
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.