Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Map sortiert nach zwei keys

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
14.07.2011, 14:06 Uhr
~kAnI
Gast


Hallo

bitte sagt mir was ich falsch mache!!!

Ich habe eine map, die als key ein struct Identifier bekommt, damit ich statt nur einem key zwei habe.

Nach dem Einfügen des ersten Elements (elem1) in die map settings_ bekomme ich einen Iterator ret0 (siehe code).

Das zweite Element (elem2) hat einen gleichen ersten key (toolId) wie elem1, aber einen anderen zweiten key (rowNum).

Also, würde ich erwarten, dass nach dem zweiten Einfügen in der map zwei Elemente sind. Das passiert aber anscheinend nicht, weil nach dem zweiten Einfügen die Iteratoren ret0 und ret1 gleich sind.

D.h. die Benutzung meiner beiden keys funktioniert noch nicht richtig. Es wird nur der erste Schlüssel berücksichtigt. Und ich habe leider keine Idee was ich falsch mache.

Hier ist mein Code:


C++:

struct Identifier
{
    FGuid toolId;
    int rowNum;

    Identifier(FGuid id, int row) : toolId(id), rowNum(row) {}

    bool operator<(const Identifier& identifier) const
    {
        return toolId < identifier.toolId;
    }
};
struct SettingsItem
{
    std::wstring guid;
    std::wstring value;
};
typedef std::map<Identifier, std::deque<SettingsItem>> SETTINGS;

static SETTINGS settings_;

int main()
{
    SettingsItem toolSet;
    ToolId toolId(12345);
    int row0 = 0;
    int row1 = 1;
    Identifier ident0(toolId, row0);
    Identifier ident1(toolId, row1);

    std::pair<std::map<Identifier, std::deque<SettingsItem>>::iterator, bool> ret0;
    std::pair<std::map<Identifier, std::deque<SettingsItem>>::iterator, bool> ret1;

    ret0 = settings_.insert(SETTINGS::value_type(ident0, toolSet)); //elem1
    ret1 = settings_.insert(SETTINGS::value_type(ident1, toolSet)); //elem2

    return 0;
}



Vielen Dank für euere Hilfe!!!


Bearbeitung von 0xdeadbeef:

cpp-Tags geradegezogen


Dieser Post wurde am 14.07.2011 um 14:10 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.07.2011, 14:16 Uhr
0xdeadbeef
Gott
(Operator)


Das ist kein Wunder, weil dein operator< nur toolID vergleicht. Für die Map, die zwei Schlüssel für gleich hält, wenn !(k1 < k2) && !(k2 < k1), sind dann alle Schlüssel gleich, deren toolID gleich ist. Ich nehme an, du meinst

C++:
    bool operator<(const Identifier& identifier) const
    {
        return toolId < identifier.toolId ||
               (toolID == identifier && numRow < identifier.numRow);
    }


Übrigens würde ich an deiner Stelle Vergleichsoperatoren generell als freie Funktionen statt als Member implementieren. Es macht in diesem konkreten Fall keine Unterschiede, aber wenn du eine Klasse mit einem Konstruktor hast, der einen Parameter erwartet und nicht explicit ist, ist die Notation damit konsistenter, weil dieser auf beiden Seiten des Operators verwendet werden kann. Beispiel:

C++:
class foo {
public:
  foo(int x) : x_(x) { }
  int x() const { return x_; }

  bool operator==(foo const &rhs) { return x_ == rhs.x_; }

private:
  int x_;
};

bool operator !=(foo const &lhs, foo const &rhs) {
  return lhs.x() != rhs.x();
}

...

foo(2) == 2; // geht
2 == foo(2); // geht nicht

foo(2) != 2; // geht
2 != foo(2); // geht


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.07.2011, 14:40 Uhr
~kAnI
Gast


Ich habe es gleich verbessert und jetzt funktioniert es richtig!

Vielen, vielen DANK!!!
 
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: