Portál AbcLinuxu, 12. května 2025 04:34

Dotaz: Serazeni C++ map podle hodnoty

13.3.2012 20:14 Karel Machyna
Serazeni C++ map podle hodnoty
Přečteno: 598×
Odpovědět | Admin
Zdravim, mam v C++ nasledujici mapu:
map< string,vector< int > > mymap;
Pokud ji pres iterator takto projdu a vypisu:
        for (it=mymap.begin(); it != mymap.end(); it++)
        {
            cout << (*it).first << " => ";
            vector< int > v = (*it).second;
            for (it2=v.begin(); it2 < v.end(); it2++)
                cout << " " << *it; 
            cout << endl;
        }  
Tak mi ji to vypise serazenou abecedne podle tech retezcu v klici. Ja bych tu mapu potreboval projit sestupne podle velikosti vektoru (kde velikosti vektory myslim pocet prvku v tomto vektoru), tedy vzhledem k predchazejicimu kodu sestupne serazenou podle (*it).second.size(). Jak toho prosim mohu co nejjednoduseji dosahnout?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.3.2012 20:57 ludo
Rozbalit Rozbalit vše Re: Serazeni C++ map podle hodnoty
Odpovědět | | Sbalit | Link | Blokovat | Admin
zadefinuj porovnavaci functor, treba:
struct mycompare {
    typedef pair< string, vector< int> > mypair;
    
    bool operator()(const mypair& x, const mypair& y) {
        return x.second.size() < y.second.size();
    }
};

jsou i dalsi moznosti, jako boost::bind, nebo pripadne lambda funkce v novym standarde (ale tam v tom prehled moc nemam)

14.3.2012 09:49 Karel Machyna
Rozbalit Rozbalit vše Re: Serazeni C++ map podle hodnoty
Ano, ten functor vypada, ze to je presne co potrebuji. S temito prostredky C++, ale nemam moc zkusenosti, muzete prosim k tomu Vasemu kodu jeste uvest, jakym stylem tu strukturu mycompare pouziju, abych tu moji mapu prosel v pozadovanem poradi?
14.3.2012 12:30 ludo
Rozbalit Rozbalit vše Re: Serazeni C++ map podle hodnoty
Tak to ze to chces v tom poradi jenom projit, jsem si nevsiml. Kdyby jsi tu mapu chtel mit od zacatku setridenou podle velikosti tech vektoru tak ji staci zadeklarovat jako
typedef map< string,vector< int>,mycompare> mymap;
Kdyz ji potrebujes raz setridenou podle stringu a jindy podle velikosti vektoru tak bych asi pouzil tu multimapu, jak je navrhnuto v dalsim komentari. Jestli je to jenom kvuli jednomu vypisu, tak bych zvazil zkopirovani prvu do vektoru a pak sort (kde by taky byl jako parametr ten porovnavaci objekt...
14.3.2012 10:24 me vakérav
Rozbalit Rozbalit vše Re: Serazeni C++ map podle hodnoty
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud to v tom pořadí chceš procházet častěji, můžeš to podle toho řadit přímo: struktura multimap, kde klíčem je délka toho vektoru a string+vektor samotný vrznout do nějaké obalovací struktury. Pak už vybíráš stejně jako u jiných kontejnerů.
16.3.2012 13:49 ::: | skóre: 14 | blog: e_lama
Rozbalit Rozbalit vše Re: Serazeni C++ map podle hodnoty
Odpovědět | | Sbalit | Link | Blokovat | Admin
s tou multimapou by byl problem kdyz se nektery z tech vektoru zmeni - potom bys tu polozku musel vyjmout a zase vlozit aby to bylo spravne serazeny...

zalezi jaky vsechny operace s tim budes delat a jak casto, ale pokud to neni neco hodne specifickyho tak nejjednodussi a asi i nejrychlejsi bude vytvorit:

vector<vector<int> *>

do nej zkopirovat ukazatele na ty puvodni vektory a seradit to pomoci sort()

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.