Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] map - chiave = coppia di numeri

    Ciao
    Ho cercato su google e sul forum, ma non sono riuscita a trovare risposta. Ovunque si dice che in una map la key puo' essere di qualsiasi tipo (quindi, anche una coppia di numeri, magari organizzata come struct o come array di due elementi?) ma non ho trovato esempi e i miei tentativi di realizzare quello che cerco producono solo errori...
    In breve. In un file in lettura, ho un elenco di valori i j value, cioe' a ogni coppia i j corrisponde un value. Vorrei creare una mappa e ho provato con una struttura:
    codice:
    // STRUTTURA
    struct coordinate
    {
      int index_i;
      int index_j;
    };
    // MAPPA
      map<coordinate,double> value;
    // LETTURA
       while (!input.eof())
         {
           input>>ii>>jj>>x;
           coordinate coppia;
           coppia.index_i=ii;
           coppia.index_j=jj;
           value[coppia]=x;
         }
    Ma non va! Orribili errori di compilazione!

    /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_function.h: In member function `bool std::less<_Tp>:perator()(const _Tp&, const _Tp&) const [with _Tp = coordinate]':
    /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_tree.h:1156: instantiated from `typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::lower_bound(const _Key&) [with _Key = coordinate, _Val = std:air<const coordinate, double>, _KeyOfValue = std::_Select1st<std:air<const coordinate, double> >, _Compare = std::less<coordinate>, _Alloc = std::allocator<std:air<const coordinate, double> >]'
    /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_map.h:540: instantiated from `typename std::_Rb_tree<_Key, std:air<const _Key, _Tp>, std::_Select1st<std:air<const _Key, _Tp> >, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::lower_bound(const _Key&) [with _Key = coordinate, _Tp = double, _Compare = std::less<coordinate>, _Alloc = std::allocator<std:air<const coordinate, double> >]'
    /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_map.h:336: instantiated from `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>:perator[](const _Key&) [with _Key = coordinate, _Tp = double, _Compare = std::less<coordinate>, _Alloc = std::allocator<std:air<const coordinates, double> >]'
    ComputeAcpulse.cpp:82: instantiated from here
    /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y'
    Exit 1

    Dove sbaglio?
    Cosa suggerite?

  2. #2

    Re: [C++] map - chiave = coppia di numeri

    Originariamente inviato da gulpgiulia
    Ovunque si dice che in una map la key puo' essere di qualsiasi tipo
    errato, devono essere definiti alcuni operatori per il tipo chiave, che non ricordo esattamente, ma per fortuna c'è il compilatore, che:

    Originariamente inviato da gulpgiulia
    ComputeAcpulse.cpp:82: instantiated from here
    /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y'
    Exit 1

    Dove sbaglio?
    Cosa suggerite?
    ti dice esattamente ciò di cui ha bisogno: l'operatore "<" per la classe coordinate.

  3. #3
    ... ti ringrazio per la tua risposta... ma purtroppo non l'ho capita!
    Che devo fare esattamente, per non litigare con il compilatore?

  4. #4
    Originariamente inviato da gulpgiulia
    ... ti ringrazio per la tua risposta... ma purtroppo non l'ho capita!
    Che devo fare esattamente, per non litigare con il compilatore?
    Il compilatore vuole che tu, definisca l'operatore "<" per la classe "coordinate".
    Ad esempio:
    Codice PHP:
    bool operator < (const coordinate &c1, const coordinate &c2){
        
    // qui solo tu puoi sapere quale valore restituire al chiamante
        // io restituisco true solo come esempio.
        
    return true;


  5. #5
    ...allora,
    io ho esattamente copiato il codice che hai inserito nel precedente post, e lo ho incollato tra la definizione della struttura coordinate e il main. In questo modo non ricevo piu' errori di compilazione. Quindi, OK. (Anche se continuo a non capire cosa esattamente stiamo facendo inserendo questo operatore...)
    Ma non sono sicura che stia funzionando... perche' non sono sicura di saper usare correttamente la mappa...
    La mia intenzione e' riempire la mappa con il contenuto di un file in lettura, e se provo a stampare i valori della mappa trovo invece solo 0.00
    Cercando di essewre piu' chiara, copio il codice con cui utilizzo la mappa:
    codice:
    // LETTURA
      if ((input = fopen(InputFile, "r")) == NULL)   
        { 
          printf("\nCannot open file %s\n\n",InputFile);
          printf ("\nPress ENTER to continue.\n\n");
          getchar (); // wait for input            
          return(1); 
        } 
      
      while (!feof(input))  
         {
           fscanf(input,"%d  %d  %lf  %lf %lf %lf %lf",
    	      &ii,&jj,&dummy,&dummy,&value,&dummy,&dummy);
    // ----------------------------------------------------------------------------
    // ELABORAZIONE   
           coordinate coppia;
           coppia.index_i=ii;
           coppia.index_j=jj;
           EnDep[coppia]=value;
         }
      
      fclose(input);
      
      coordinate coppia;
      coppia.index_i=2;
      coppia.index_j=11;
      printf("%2.10lf\n",EnDep[coppia]);

  6. #6
    Originariamente inviato da gulpgiulia
    ...allora,
    io ho esattamente copiato il codice che hai inserito nel precedente post, e lo ho incollato tra la definizione della struttura coordinate e il main. In questo modo non ricevo piu' errori di compilazione. Quindi, OK. (Anche se continuo a non capire cosa esattamente stiamo facendo inserendo questo operatore...)
    Ma non sono sicura che stia funzionando... perche' non sono sicura di saper usare correttamente la mappa...
    La mia intenzione e' riempire la mappa con il contenuto di un file in lettura, e se provo a stampare i valori della mappa trovo invece solo 0.00
    La classe std::map ha bisogno di chiavi per cui sia definito l'operatore "<" (e te l'ha detto il compilatore in fase di compilazione). E' un operatore matematico che restituisce true se il primo argomento è minore del secondo.
    Il compilatore purtroppo non può minimamente immaginare quale valore restituire per una chiave che tu hai definito. Perciò il criterio lo devi definire tu (come ho scritto nel commento del codice che ti ho postato).
    Evidentemente il criterio dovrà essere matematicamente sensato, ad esempio se a < b restituisce true, evidentemente b < a deve restituire false. Se, come hai detto, hai semplicemente copia/incollato il codice che ti ho postato, allora si cade nel paradosso che il primo argomento è sempre minore del secondo. Ovvero a < b ma anche b < a.
    Evidentemente la cosa non è gradita alla std::map e purtroppo non viene emesso alcun errore di compilazione.

    Tuttavia, trovare un criterio per l'operatore "<", che abbia senso matematicamente parlando non mi pare molto complicato, ad esempio potresti fare il confronto tra la somma delle coordinate, oppure la lunghezza (magari al quadrato, così eviti una radice quadrata) del vettore matematico individuato dalle coordinate.

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.