Portál AbcLinuxu, 12. května 2025 04:34
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?
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)
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...
vector<vector<int> *>
do nej zkopirovat ukazatele na ty puvodni vektory a seradit to pomoci sort()
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.