[C++] STL map dynamische sortering probleem

Pagina: 1
Acties:

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Hoi allemaal,

Ik ben me aan het verdiepen STL en stuit nu op problemen met sorteren.
Deze commandline applicatie gemaakt in VC++ 6.0 sorteert data in een file ascending of descending via parameters opgegeven in de commandline.

Nu maak ik de map aan via een typedef:
C++:
1
typedef std::map<std::string, int, std::less<std::string>, std::allocator<int> > mapOrder;


Nu wil ik conditioneel oplopend of aflopend sorteren:
C++:
1
2
3
4
5
6
7
8
9
10
if (iSortOrder == 0)
{
    // Oplopend
    typedef std::map<std::string, int, std::less<std::string>, std::allocator<int> > mapOrder;
}
else
{
    // Aflopend
    typedef std::map<std::string, int, std::greater<std::string>, std::allocator<int> > mapOrder;
}

Nu gaat dit natuurlijk nooit werken aangezien je een typedef in de scope van een if statement defineert en deze typedef niet daarbuiten mag gebruiken.

Ook heb ik geprobeerd expliciet sort aan te roepen, maar dit geeft een hoop vage compile errors onder VC6.
C++:
1
2
3
4
5
if (iSortOrder == 1)
{
    // Order descending
    std::sort(myMap.begin(), myMap.end(), std::greater<std::string>());
}


Wie kan mij een beetje op weg helpen hoe dit probleem zo efficient mogelijk op te lossen?

It’s nice to be important but it’s more important to be nice


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Je geeft het probleem eigenlijk zelf al aan: de sort order is een inherent onderdeel van de template instance. Deze kun je dus op runtime niet meer wijzigen oid, en is een vast onderdeel van het type waaraan je referereert. Je zult je probleem dus op een ander niveau op moeten lossen: ik snap alleen niet helemaal je probleem en waarom je een map wil hebben voor een file. Lijkt mij een beetje 'wrong tool for the right job' ;)

En een map, als inherent sorted class, exposed niet de correcte functies en properties om extern gesorteerd te kunnen worden, dus expliciet std::sort aanroepen kan idd niet werken.

Professionele website nodig?


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
curry684 schreef op 24 maart 2004 @ 10:01:
Je geeft het probleem eigenlijk zelf al aan: de sort order is een inherent onderdeel van de template instance. Deze kun je dus op runtime niet meer wijzigen oid, en is een vast onderdeel van het type waaraan je referereert.
Je zult je probleem dus op een ander niveau op moeten lossen.
Ik zit helemaal vast heb je suggesties?
ik snap alleen niet helemaal je probleem en waarom je een map wil hebben voor een file. Lijkt mij een beetje 'wrong tool for the right job' ;)
Sorry ben niet helemaal duidelijk geweest. De file die ik binnenkrijg (ook via de commandline) bevat een aantal pagina's met allemaal een nummer op een vaste positie. De pagina's in die file moeten oplopend of aflopend gesorteerd worden op basis van dat nummer.
De oplossing met een map heb ik al perfect werkend met oplopende sortering.
Ik gebruik een map omdat het nummer geassocieerd moet worden met een specifieke pagina nummer in de file.
En een map, als inherent sorted class, exposed niet de correcte functies en properties om extern gesorteerd te kunnen worden, dus expliciet std::sort aanroepen kan idd niet werken.
Dat is jammer. Zijn er geen andere manieren?

It’s nice to be important but it’s more important to be nice


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Je probeert een inherente eigenschap van het containertype (de sortorder van de map) op runtime te bepalen. Dan ben je met het foute containertype bezig.

Ik zou eerder denken aan dit concept:
C++:
1
2
3
4
5
6
7
8
9
10
class Page
{
  int PageNumber;
  std::vector<std::string> Lines;
};

class MyOwnFile
{
  std::vector<Page> Pages;
};

Op deze manier kun je custom sorten wat je wil.

Professionele website nodig?


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Bedankt voor je hulp ik denk met 2 vectors zou het ook zeker moeten lukken.

It’s nice to be important but it’s more important to be nice


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Ik zou de regels inlezen in een vector en de output met sort doen, afhankelijk van de switch.

Overigens kun je een map niet sorteren met std::sort, omdat het geen randomaccess iterator heeft. ( Wel logisch ook, het wordt al gesorteerd, namelijk op de key values. Wel evt met een custom sort routine, zoals je zelf al had gezien )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 24 maart 2004 @ 10:01:
En een map, als inherent sorted class, exposed niet de correcte functies en properties om extern gesorteerd te kunnen worden, dus expliciet std::sort aanroepen kan idd niet werken.
Natuurlijk wel, je kunt je eigen comparator meegeven. In zo'n comparator object kun je dus @ runtime bepalen hoe er gesorteert moet worden. (Hier moet je natuurlijk wel mee oppassen: je mag de sorteervolgorde alleen wijzigen als de map leeg is, anders is ie niet meer consistent)

Ik ben het er wel mee eens dat je een map niet moet gebruiken om dingen te sorteren, daar zijn weer andere structuren voor :)

JonkieXL: wat associeer je trouwens met wat? Je verhaal is een beetje onduidelijk. Wat is die std::string die je erin stopt precies? (en die int was de paginanummer dan he?)

[ Voor 35% gewijzigd door .oisyn op 24-03-2004 15:25 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

.oisyn schreef op 24 maart 2004 @ 15:21:
[...]

Natuurlijk wel, je kunt je eigen comparator meegeven. In zo'n comparator object kun je dus @ runtime bepalen hoe er gesorteert moet worden.
Oeps :X * curry684 vangt weer een prutz0r-note omdat ie hier even niet aan had gedacht vanochtend :P

Professionele website nodig?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
.oisyn schreef op 24 maart 2004 @ 15:21:
[...]


Natuurlijk wel, je kunt je eigen comparator meegeven. In zo'n comparator object kun je dus @ runtime bepalen hoe er gesorteert moet worden. (Hier moet je natuurlijk wel mee oppassen: je mag de sorteervolgorde alleen wijzigen als de map leeg is, anders is ie niet meer consistent)
En zelfs als je het op dat moment doet is het technisch gezien nog undefined. Als een map implementatie stiekem een kopietje van een van je keys intern houdt, bv omdat dat handig is voor een root node oid, dan hang je.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1