logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STL Pair i vector<Pair> operator przypisania?

pgregor 06 Lut 2011 01:47 1397 2
  • #1 9110016
    pgregor
    Poziom 10  
    Posty: 7
    witam,
    mam maly problem.

    zdefiniowalem mape:
    typedef Pair<double *, double * > vect;
    typedef std::vector<vect>StrikeVolVector;
    typedef std::map<double, std::vector<vect>, ltstr> TermStrikeVolMap;


    cel jest taki, zeby miec double TERMIN i wektor dwoch double, bo chce sortowac te dwojki dla zadanego double TERMIN, tzn, dla kazdego TERMIN maja byc dwojki w mapie od najmniejszego do najwiekszego (ze wzgledu na pierwszy argument kazdej dwojki)
    problem powstaje, gdy chce wpisac pare w mape dla danego TERM
    typedef Pair<double *, double * > StrikeVolPair;
    StrikeVolVector KVolVect;
    TermStrikeVolMap VolMap;
    double * STRIKEptr=&STRIKE;
    double * SIGMAptr=&SIGMA;
                StrikeVolPair * kvPair = new StrikeVolPair(STRIKEptr, SIGMAptr);
                KVolVect.push_back(*kvPair);
                VolMap[TERM]=*kvPair;   // error !


    blad jest tresci takiej:
    Cannot assign Pair<double*, double*> to std::vector<Pair<double*, double*> > without "std::vector<Pair<double*, double*> >::operator=(const std::vector<Pair<double*, double*> >&)

    ale przeciez nie moge pisac operatora w klasie ::std.
    jak zdefiniowac operator= abym mogl wpisac pary StrikeVolPair na te pary z mapy?

    jesli nie bedzie na to sposobu, to czy zdefiniowanie struktury z dwoma argumentami pozwoli mi osiagnac ten sam efekt?
  • #2 9112289
    pallid
    Poziom 20  
    Posty: 155
    Pomógł: 57
    Ocena: 6
    Program dziala zgodnie z definicja typow:
    typedef Pair<double *, double * > vect;
    typedef std::vector<vect>StrikeVolVector;
    typedef std::map<double, std::vector<vect>, ltstr> TermStrikeVolMap;


    typedef Pair<double *, double * > StrikeVolPair;
    StrikeVolVector KVolVect;
    TermStrikeVolMap VolMap;
    double * STRIKEptr=&STRIKE;
    double * SIGMAptr=&SIGMA;
                StrikeVolPair * kvPair = new StrikeVolPair(STRIKEptr, SIGMAptr);
                KVolVect.push_back(*kvPair);
                VolMap[TERM]=*kvPair;   // error !


    W powyzszym kodzie VolMap[TERM] zwraca zmienna typu vector<vect>, wiec nie mozesz przypisac do niego *kvPair (typ: pair<double*, double*>).

    Powinienes raczej uzyc takiej konstrukcji:
    VolMap[TERM].push_back(*kvPair);


    Poza tym, masz ten sam "problem", o ktorym wspomnialem w odpowiedzi na innego Twojego posta.
    HTH.
  • #3 9112828
    pgregor
    Poziom 10  
    Posty: 7
    rozwiazalem to inaczej, prosciej.

    mam klase:

    class TKV{
        public:
            double term;
            double strike;
            double volatility;
            bool operator<(TKV rhs) { return strike < rhs.strike;}
            TKV(double * ptr1, double * ptr2, double *ptr3){
                term=*ptr1;
                strike=*ptr2;
                volatility=*ptr3;
            }
            //friend class VolSurfaceDeltaToK2;
            //bool operator<(const TKV rhs) { return m_iData < rhs.m_iData; }
            static bool MyDataSortPredicate1(const TKV& d1, const TKV& d2)
                {
                if (d1.term==d2.term){
                return d1.strike< d2.strike;
                }
                else{
                    return d1.term<d2.term;
                }
            }


    i wektor obiektow tej klasy:

    std::vector<TKV>myVector;


    wpisuje na niego wartosci:

    TKV x(TERMptr,STRIKEptr, SIGMAptr);
    myVector.push_back(x);


    i na koncu sortuje w kolejnosci: najpierw ze wzgledu na TERM, potem STRIKE
    i wypisuje sobie sprawdzajaco na ekran:

    std::sort(myVector.begin(),myVector.end(), TKV::MyDataSortPredicate1);
    
        for (std::vector<TKV>::iterator citer = myVector.begin();
        citer != myVector.end(); ++citer)
        {
        cout << (*citer).term<<"\t" <<(*citer).strike<<"\t"<<(*citer).volatility<< endl;
        }
    
REKLAMA