www.mikrocontroller.net

Forum: PC-Programmierung copy_if


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe folgende Templatefunktion:

template <typename Input, typename output typename Predicate>
output copy_if (Input first,Input last,output result,Predicate Pred)
{

   remove_copy_if(first,last,result,Pred);




}
Wie kann ich jetzt das Prädikat Pred negieren,dass aus remove_copy_if 
ein copy_if wird?
Habe schon alles ausprobiert not1,!...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zuerst einmal das wichtigste: Deinem Code fehlt die Konsistenz.
Manche template-Typen beginnen bei dir mit einem Großbuchstaben, andere 
mit einem Kleinbuchstaben, bei Variablen sieht es ähnlich aus.

Durch so einen Stil können sich ganz schnell Fehler einschleichen. Denn 
wer das als "unwichtig" abtut, ist erfahrungsgemäß oft auch in anderen 
Bereichen ungenau.

> Habe schon alles ausprobiert not1,!...

not1 funktioniert bei mir einwandfrei, ohne jede seltsame Syntax:
remove_copy_if(first, last, result, not1(pred));

Hast du die Fehlermeldung gelesen? Vielleicht einen Header vergessen? 
Für deine Funktion benötigst du mindestens die beiden Header, die die 
Dokumentation vorschreibt: Siehe 
http://www.sgi.com/tech/stl/remove_copy_if.html und 
http://www.sgi.com/tech/stl/unary_negate.html .

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die beiden Header functional und algorithm inkludiert.

Es kommen immer die Fehlermeldungen:

Error  1  error C2825: '_Fn1': must be a class or namespace when 
followed by '::'  c:\program files\microsoft visual studio 
8\vc\include\functional  205
Error  2  error C2039: 'argument_type' : is not a member of '`global 
namespace''  c:\program files\microsoft visual studio 
8\vc\include\functional  205
Error  3  error C2146: syntax error : missing ',' before identifier 
'argument_type'  c:\program files\microsoft visual studio 
8\vc\include\functional  205
Error  4  error C2065: 'argument_type' : undeclared identifier 
c:\program files\microsoft visual studio 8\vc\include\functional  205


Mein main sieht folgendermaßen aus:


bool isPos(int x)
{

  return x<0;

}

int main ()
{

  int a[]={3,5,-7,-4,8,-9};
  int b[]={4,-6,5,3,8,-9};

  vector<int> v2(b,b+sizeof(b)/sizeof(int));
  vector<int> v3;



  cout <<endl;
  Copy_if(v2.begin(),v2.end(),back_inserter(v3),isPos);
  copy(v3.begin(),v3.end(),ostream_iterator<int>(cout," "));
}

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mein main sieht folgendermaßen aus:
> [...]

Bitte poste mal ein vollständiges, aber minimales Codebeispiel, bei 
dem der Fehler auftritt. Dein Code lässt sich nicht kompilieren, weil 
die Definition von Copy_if (Achtung, großer Anfangs-Buchstabe) fehlt und 
die ganzen Header nicht eingebunden sind. Ein vollständiges Beispiel, 
das man direkt per copy&paste in seinen Editor ziehen und testweise 
kompilieren kann, hilft wahrscheinlich eher.

Aus den Fehlermeldungen schließe ich, dass du Visual Studio 2005 
benutzt, ist das korrekt? Hast du eine andere als die Standard-STL 
installiert?

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein benutze die STL von VisualStudio 2005:

Also
template.h:

#include <algorithm>
#include <iterator>
#include <functional>

using namespace std;

template <typename TInputItor,typename TOutputItor,typename TPred>
void Copy_if(TInputItor first,TInputItor last,TOutputItor result,TPred 
Pred)
{


  remove_copy_if(first,last,result,not1(Pred));



}
-----------------------------------------------------------
main.cpp:


#include "template.h"
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

bool isPos(int x)
{

  return x<0;

}

int main ()
{


  int b[]={4,-6,5,3,8,-9};

  vector<int> v2(b,b+sizeof(b)/sizeof(int));
  vector<int> v3;


  cout <<endl;
  Copy_if(v2.begin(),v2.end(),back_inserter(v3),isPos);
  copy(v3.begin(),v3.end(),ostream_iterator<int>(cout," "));
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
isPos ist kein Funktionsobjekt, sondern eine normale Funktion. Damit 
geht not1 nicht.

Probier mal:
struct isPos : std::unary_function<int, bool>
{
    bool operator()(int x) const 
    {
      return x<0;
    }
};

Copy_if(v2.begin(),v2.end(),back_inserter(v3),isPos());

Oder:
Copy_if(v2.begin(),v2.end(),back_inserter(v3),
        std::bind2nd(std::less<int>(), 0));

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke hat funktioniert!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.