Mehrdimensionale Polynome in set unterbringen



  • Hallo,

    ich hab folgendes Problem: Ich will eine Menge von mehrdimenseionale Polynomen in C++ modellieren und in einer Klasse kapseln. Wichtig dabei ist vorallem die Mengeneingeschaft, dass jedes Polynom entweder genau einmal in der Menge ist oder eben nicht. Dazu habe ich mir set aus der STL angesehen, welches die Mengeneigenschaft ja mit einem RB-Baum realisiert, aber dafür eine Ordnung vorraussetzt.

    Die Polynome haben auch eine Ordnung, der ich mich von einer anderen Stelle aus dem Projekt bedienen kann:

    struct ex_is_lesseq_deggrlex : public ex_is_lesseq
    {
        ex_is_lesseq_deggrlex(const list<symbol>& variables) : ex_is_lesseq(variables)
        {}
    
    ...
    
        bool operator() (const ex &a, const ex &b) const
        {
    ...
    

    Wie man sieht ist die Ordnung von der Liste der benutzen Symbole in den Polynomen abhängig.

    Jetzt wollte ich in meiner PolynomMengen-Klasse set ungefähr so benutzen:

    set<MultivariatePolynomial, ex_is_lesseq_deggrlex> Elements;
    

    Das geht natürlich nicht, weil die Liste der Symbole noch nicht ermittelt ist.

    struct ex_is_lesseq_deggrlex meineOrdnung;
    set<MultivariatePolynomial, meineOrdnung> Elements;
    

    Klappt natürlich auch nicht.

    Der Konstruktor wäre irgendwie von der Art:

    MultiPolynomialSet (list<MultivariatePolynomial>);
    

    Der müsste zunächst die Liste nach symbolen durchsuchen, um dann nacher ein set zu deklarieren mit der entsprechenden Ordnung. Aber wie?

    Irgendwelche Ideen?

    Vielen Dank

    Joachim



  • Wissen die ex-Objekte nicht die Liste ihrer eigenen Symbole?



  • Michael E. schrieb:

    Wissen die ex-Objekte nicht die Liste ihrer eigenen Symbole?

    Nope. Es handelt sich bei den ex-Objekten überings um ex aus GiNaC.



  • In welcher Beziehung stehen denn die list<symbol>, die dein Funktor vergleicht, mit den Polynomen, die du in der set<> unterbringen willst?



  • PolynomJo schrieb:

    Michael E. schrieb:

    Wissen die ex-Objekte nicht die Liste ihrer eigenen Symbole?

    Nope. Es handelt sich bei den ex-Objekten überings um ex aus GiNaC.

    Kenn ich nicht, aber in der Doku steht eine Struktur ex_is_less, die den operator() überladen hat. Kannst du diese Struktur benutzen?



  • Michael E. schrieb:

    PolynomJo schrieb:

    Michael E. schrieb:

    Wissen die ex-Objekte nicht die Liste ihrer eigenen Symbole?

    Nope. Es handelt sich bei den ex-Objekten überings um ex aus GiNaC.

    Kenn ich nicht, aber in der Doku steht eine Struktur ex_is_less, die den operator() überladen hat. Kannst du diese Struktur benutzen?

    Oh! Ja vielen Dank! Das müsste klappen. 👍



  • #include <ginac/ginac.h>
    #include <iterator>
    
    namespace GiNaC
    {
    
    template<class monomialOrdering> class MultivariatePolynomialSet2
    {
    public:
    	MultivariatePolynomialSet2();
    
    	bool isEmpty() const;
    
    	int size() const;
    
    private:
    	set<MultivariatePolynomial<monomialOrdering>, ex_is_less> mElements;
    
    };
    
    template<class monomialOrdering> inline GiNaC::MultivariatePolynomialSet2<
    		monomialOrdering>::MultivariatePolynomialSet2()
    {
    }
    
    template<class monomialOrdering> inline bool GiNaC::MultivariatePolynomialSet2<
    		monomialOrdering>::isEmpty() const
    {
    	return mElements.emtpy();
    }
    
    template<class monomialOrdering> inline int GiNaC::MultivariatePolynomialSet2<
    		monomialOrdering>::size() const
    {
    	return mElements.size();
    }
    }
    

    Ich versteh es immer noch nciht 😞

    Jetzt bekomme ich, wenn ich z.B. isEmpty aufrufe folgendes:

    example_set.cpp: In function ‘int main(int, char**)’:
    example_set.cpp:59: error: request for member ‘isEmpty’ in ‘T’, which is of non-class type ‘GiNaC::MultivariatePolynomialSet2<GiNaC::ex_is_lesseq_deggrlex>()’
    

    Dabei müsste das nach http://www.cplusplus.com/reference/stl/set/set/ (Zeile 24) so funktionieren oder?



  • Dann solltest du auch mal zeigen, wie dieser Aufruf aussieht, der den Fehler verursacht.


Anmelden zum Antworten