Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » struct als key in map -> nur wie?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.07.2006, 17:16 Uhr
~vani
Gast


Holla,

ich habe ein struct und würde das gern in eine Map bringen, ich weiß allerdings nicht wie ich die map aufbauen kann oder wie ich dann den iterator drüber laufen lasse:



Code:


struct myStruct {
     double a;
     int b;
     char c;
};

typedef std::map<myStruct, int> MyMap;

//....in funktion...

MyMap mm;

//der Zugriff ab hier klappt net so
struct myStruct ms;

ms.a = 2.0;
ms.b = 8;
ms.c = 'c';

mm[ms] = 3;

//...iterieren über das map schaffe ich auch nicht...

MyMap::iterator iter

  for(iter = mm.begin(); iter != mm.end(); iter++)
{
      std::cout << (*iter).first << std::endl;    
}




Goolge und sufu halfen mir bis jetzt nicht weiter...

Danke euch
leider kann mir weder sufu noch goole hier weiterhelfen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.07.2006, 18:19 Uhr
kronos
Quotenfisch
(Operator)


Du solltest für dein struct operator< implementieren, oder dem map 'ne compare-funktion mitgeben...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.07.2006, 18:27 Uhr
~vani
Gast


Vielen Dank!
Mit einem Operator< gehts jetzt...

ich versuche auch gleichzeitig einen iterator auf die map anzuwenden:



Code:

     MyMap::const_iterator iter;
     for(iter = m.begin(); iter != m.end(); iter++)
     {
         std::cout << (*iter).first << std::endl;    
     }




die fehlermeldungen sind wie folgt:


Code:


  error: no match for 'operator<<' in 'std::cout << (&iter)->std::_Rb_tree_iterator<_Val, _Ref, _Ptr>::operator* [with _Val = std::pair<const Cell_Coords, int>, _Ref = const std::pair<const Cell_Coords, int>&, _Ptr = const std::pair<const Cell_Coords, int>*]()->std::pair<const Cell_Coords, int>::first'
/usr/include/c++/3.3/bits/ostream.tcc:63: error: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:74: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:86: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:122: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:156: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:98: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/ostream:178: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/ostream:189: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/ostream:193: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/ostream:204: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:181: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:216: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:241: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/ostream:219: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:265: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:289: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3/bits/ostream.tcc:313: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Trai




ich dachte das evtl. jetzt auch der operator << definiert werden muss...habe es so versucht z.B.:



Code:


     std::string operator<<(const MyStruct& rhs) const
     {
         return "(" + rhs.a + "," + rhs.b + ")";  
     }





Klappt wohl noch nicht so ganz....
mit dem rückgabewert gibts probleme natürlich....ich weiß an der stelle jetzt aber nimmer weiter.

wie kann man denn dafür dann den iterator laufen lassen?

Danke für Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.07.2006, 18:41 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
std::ostream& operator<< (std::ostream& out, const MyStruct& obj) {
      return out<< "("<<obj.a<<";"<<obj.b<<")";
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 16.07.2006 um 18:55 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.07.2006, 19:19 Uhr
~vani
Gast


Ah danke...
ich nehme an ich muss diese Operator-Überladung NICHT in meiner struktur definieren?
Aber wenn ich sie außerhalb einer Klasse einfach im Header-file definiere also bevor eine Klasse entsteht bekomme ich den fehler multiple definition of operator<<
wohin damit jetzt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.07.2006, 19:30 Uhr
~vani
Gast


jetzt gehts danke habs mehrfach drin gehabt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.07.2006, 21:47 Uhr
~vani
Gast


Hallo,

meine map sieht so aus:


C++:
struct Cell_Coords {
    int row;
    int col;
    
    bool operator<(const Cell_Coords& cc) const
    {
        if(row == cc.row)
            return col < cc.col;  
        return row < cc.row;
    }
};


typedef std::map<Cell_Coords,int> MatrixMap;




jetzt würde ich gern testen ob die map einen gewissen schlüssel besitzt.
also sowas wie :

C++:
if map.has_key(<2,3>) ...



wie schaffe ich das wenn ich obige struktur als schlüsseltyp habe?

Mein ansatz war folgender:

C++:
struct Cell_Coords cc;
cc.row = 0;
cc.col = 0;
int test = blur_operator[cc];
std::cout << test << std::endl;



aber so klappt es nicht mit der Meldung:


Code:
error: passing `const MatrixMap' as `this' argument of `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = Cell_Coords, _Tp = int, _Compare = std::less<Cell_Coords>, _Alloc = std::allocator<std::pair<const Cell_Coords, in



danke euch für Hilfe!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.07.2006, 14:51 Uhr
kronos
Quotenfisch
(Operator)


operator< sollte bei gleichheit schon false zurückgeben.
zu dem compiler-fehler fällt mir spontan grad nix ein
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: