Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294

    C++] map Dove solo gli elementi???

    Ciao a tutti. Qualcuno mi sa dire perche', dopo aver inserito gli elementi nella mia mappa, non sono in grado di ritrovarli?
    Per favore, un aiutino..

    Fausto

    Ecco il codice:

    #include <map>
    #include <utility>
    #include <vector>
    #include <iostream>
    using namespace std;

    typedef struct
    {
    double x;
    double y;
    } point;
    typedef pair<point *, point*> pairPointPtr;
    class pointPtrLessThen
    {
    public:
    bool operator( )(const pairPointPtr& p1, const pairPointPtr& p2) const
    {
    if (p1.first->x < p2.first->x)
    return true;
    else
    {
    if (p1.first->x == p2.first->x)
    {
    if (p1.second->x <= p2.second->x)
    return true;
    else return false;
    }
    else return false;
    }
    }
    };
    typedef map<pairPointPtr, double, pointPtrLessThen> pairPointPtrMap;
    //
    int main ()
    {
    unsigned int dim = 10;
    point * myPoints = new point[dim];
    for (unsigned int i = 0; i < dim; i++)
    {
    point tempPoint;
    tempPoint.x = double (i);
    tempPoint.y = double (i+1);
    // assegno valore
    *(myPoints + i) = tempPoint;
    }

    pairPointPtrMap distance;

    for (int i = 0; i < dim; i++)
    {
    for (int j = 0; j < dim; j++)
    if (i != j)
    {
    double val = (myPoints +i)->x + (myPoints +i)->y + (myPoints+j)->x + (myPoints+j)->y;
    cout << " val is " << val << endl;
    pairPointPtr tempPointPtr = make_pair ((myPoints+i), (myPoints+j));
    distance[tempPointPtr] = val;
    cout << "count value is" << distance.count(tempPointPtr) << endl; // why it does not find the key?
    if (distance.count(tempPointPtr) != 0)
    cout << (*(distance.find(tempPointPtr))).second << endl;
    }
    }
    }
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  2. #2
    Indenta il codice e usa i tag [code] ... [/code], che così non si capisce niente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    gia', hai ragione.

    Ecco:
    [code]
    #include <utility>
    #include <vector>
    #include <iostream>
    using namespace std;

    typedef struct
    {
    double x;
    double y;
    } point;
    typedef pair<point *, point*> pairPointPtr;
    class pointPtrLessThen
    {
    public:
    bool operator( )(const pairPointPtr& p1, const pairPointPtr& p2) const
    {
    if (p1.first->x < p2.first->x)
    return true;
    else
    {
    if (p1.first->x == p2.first->x)
    {
    if (p1.second->x <= p2.second->x)
    return true;
    else return false;
    }
    else return false;
    }
    }
    };
    typedef map<pairPointPtr, double, pointPtrLessThen> pairPointPtrMap;
    //
    int main ()
    {
    unsigned int dim = 10;
    point * myPoints = new point[dim];
    for (unsigned int i = 0; i < dim; i++)
    {
    point tempPoint;
    tempPoint.x = double (i);
    tempPoint.y = double (i+1);
    // assegno valore
    *(myPoints + i) = tempPoint;
    }

    pairPointPtrMap distance;

    for (int i = 0; i < dim; i++)
    {
    for (int j = 0; j < dim; j++)
    if (i != j)
    {
    double val = (myPoints +i)->x + (myPoints +i)->y + (myPoints+j)->x + (myPoints+j)->y;
    cout << " val is " << val << endl;
    pairPointPtr tempPointPtr = make_pair (myPoints+i, myPoints+j);
    distance[tempPointPtr] = val;
    cout << "count value is" << distance.count(tempPointPtr) << endl; // why it does not find the key?
    if (distance.count(tempPointPtr) != 0)
    cout << (*(distance.find(tempPointPtr))).second << endl;
    }
    }
    }

    [\code]
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  4. #4
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    oops.
    scusate non so come si fa


    cosa devo inserire nel testo?
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  5. #5
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    [code]
    #include <utility>
    #include <vector>
    #include <iostream>
    using namespace std;

    typedef struct
    {
    double x;
    double y;
    } point;
    typedef pair<point *, point*> pairPointPtr;
    class pointPtrLessThen
    {
    public:
    bool operator( )(const pairPointPtr& p1, const pairPointPtr& p2) const
    {
    if (p1.first->x < p2.first->x)
    return true;
    else
    {
    if (p1.first->x == p2.first->x)
    {
    if (p1.second->x <= p2.second->x)
    return true;
    else return false;
    }
    else return false;
    }
    }
    };
    typedef map<pairPointPtr, double, pointPtrLessThen> pairPointPtrMap;
    //
    int main ()
    {
    unsigned int dim = 10;
    point * myPoints = new point[dim];
    for (unsigned int i = 0; i < dim; i++)
    {
    point tempPoint;
    tempPoint.x = double (i);
    tempPoint.y = double (i+1);
    // assegno valore
    *(myPoints + i) = tempPoint;
    }

    pairPointPtrMap distance;

    for (int i = 0; i < dim; i++)
    {
    for (int j = 0; j < dim; j++)
    if (i != j)
    {
    double val = (myPoints +i)->x + (myPoints +i)->y + (myPoints+j)->x + (myPoints+j)->y;
    cout << " val is " << val << endl;
    pairPointPtr tempPointPtr = make_pair (myPoints+i, myPoints+j);
    distance[tempPointPtr] = val;
    cout << "count value is" << distance.count(tempPointPtr) << endl; // why it does not find the key?
    if (distance.count(tempPointPtr) != 0)
    cout << (*(distance.find(tempPointPtr))).second << endl;
    }
    }
    }
    [\code]
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  6. #6
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    Scusate ancora, stavo facendo delle prove con l'anteprima, ma mi sono sbagliato ed ho cliccato invia risposta.
    Io ho fatto cosi: nel testo del messaggio ho messo
    [code]
    codice indentato
    [\code]
    ma la visualizzazione e' sempre la stessa. Cosa sbaglio?
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    /code, non \code.

    Comunque ricavato l'teratore della map, accedi ai campi con it->first e it->second, dove it è il nome del tuo iteratore.

  8. #8
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    Beh no, il punto e' proprio questo. Ho bisogno di accedervi in maniera non sequenziale (questo e' solo un esempietto, il codice e' piu' complesso)
    codice:
    #include <map>
    #include <utility>
    #include <vector>
    #include <iostream>
    using namespace std;
     
    typedef struct
    {
       double x;
       double y;
    } point;
    typedef pair<point *, point*> pairPointPtr;
    class pointPtrLessThen
    {
    public:
       bool operator( )(const pairPointPtr& p1, const pairPointPtr& p2) const
       {
          if (p1.first->x < p2.first->x)
             return true;
          else
          {
             if (p1.first->x == p2.first->x)
             {
                if (p1.second->x < p2.second->x)
                   return true;
                else return false;
             }
             else return false;
          }
       }
    };
    typedef map<pairPointPtr, double, pointPtrLessThen> pairPointPtrMap;
    //
    int main ()
    {
       unsigned int dim = 10;
       point * myPoints = new point[dim];
       for (unsigned int i = 0; i < dim; i++)
       {
          point tempPoint;
          tempPoint.x = double (i);
          tempPoint.y = double (i+1);
       // assegno valore
          *(myPoints + i) = tempPoint;
       }
       
       pairPointPtrMap distance;
     
       for (int i = 0; i < dim; i++)
       {
          for (int j = 0; j < dim; j++)
             if (i != j)
             {
                double val =   (myPoints +i)->x + (myPoints +i)->y + (myPoints+j)->x + (myPoints+j)->y;
                cout << " val is " << val << endl;
                pairPointPtr tempPointPtr = make_pair (myPoints+i, myPoints+j);
                distance[tempPointPtr] = val;
                cout << "count value is" << distance.count(tempPointPtr) << endl; // why it does not find the key?
                if (distance.count(tempPointPtr) != 0)
                   cout << (*(distance.find(tempPointPtr))).second << endl;
             }
       }
    }
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Di preciso, cosa non riesci a trovare?
    I valori dei puntatori accoppiati nella pair usata come chiave?

  10. #10
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    Ciao, grazie per la rispota.
    Se provi a compilarlo dall'autput vedrai che nel secondo ciclo, dopo che ho inserito l'elemento nella mappa, il metodo count resituisce zero, cioe' non trova la chiave dell'elemento che ho appena inserito. Ma io l'ho appena inserito!!!
    Questo e' il mio problema, ma non vedo dove sia l'errore.

    Ciao,
    f
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.