 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Markus Pesti Guest
|
Posted: Wed Mar 01, 2006 4:06 pm Post subject: remove_copy problem |
|
|
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
|
Posted: Wed Mar 01, 2006 5:06 pm Post subject: Re: remove_copy problem |
|
|
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
|
Posted: Wed Mar 01, 2006 5:06 pm Post subject: Re: remove_copy problem |
|
|
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
|
Posted: Wed Mar 01, 2006 7:06 pm Post subject: Re: remove_copy problem |
|
|
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
|
Posted: Thu Mar 02, 2006 11:06 am Post subject: Re: remove_copy problem |
|
|
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
|
Posted: Thu Mar 02, 2006 12:06 pm Post subject: Re: remove_copy problem |
|
|
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
|
Posted: Thu Mar 02, 2006 3:06 pm Post subject: Re: remove_copy problem |
|
|
Rolf Magnus wrote:
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()
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 |
|
 |
|
|
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
|
|