infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: gaboru corupt din Februarie 22, 2009, 11:21:00



Titlul: SORT din STL
Scris de: gaboru corupt din Februarie 22, 2009, 11:21:00
ce ar trebui sa fac ca sa folosesc sortul din STL pe o structura? din cate stiu s-a mai discutat problema aceasta da nu gasesc unde. din cate stiu trebuie implementata o functie de comparare... dar cam atat stiu. multumesc anticipat


Titlul: Răspuns: SORT din STL
Scris de: Bogdan-Cristian Tataroiu din Februarie 22, 2009, 11:28:52
Declari o functie care primeste ca parametru 2 variabile de tipul structurii si returneaza daca in sirul sortat prima structura apare inaintea celei de-a doua. Cand apelezi sort adaugi un al treilea parametru - numele functiei.

Cod:
int cmp(const nume_structura &a, const nume_structura &b)
{
    return a.ceva < b.ceva;
}

sort(v.begin(), v.end(), cmp);

Daca folosesti "&a" in loc de "a" ar trebui sa fie mai rapid pentru ca se transmite doar o referinta pentru structura, nu toata structura.


Titlul: Răspuns: SORT din STL
Scris de: Stefan Istrate din Februarie 22, 2009, 12:09:43
Sau inzestrezi structura cu o relatie de ordine (definesti operatorul < ) si aplici sort-ul normal, tot cu 2 parametri.


Titlul: Răspuns: SORT din STL
Scris de: Andrei Grigorean din Februarie 25, 2009, 00:00:51
Stefan, mi s-a parut cam sec postul tau pentru cineva care nu stie C++. Mai jos am scris un exemplu:

Cod:
#include <algorithm>
#include <cstdio>
using namespace std;

const int MAX_N = 1024;

struct myStruct {
    int val1, val2;
    bool operator < (const myStruct& x) const {
         return val1 * val2 < x.val1 * x.val2;
    }
} v[MAX_N];
int n;

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
        scanf("%d %d", &v[i].val1, &v[i].val2);
    sort(v, v+n);
    for (int i = 0; i < n; ++i)
        printf("%d %d\n", v[i].val1, v[i].val2);
}


Titlul: Răspuns: SORT din STL
Scris de: Emanuel Cinca din Februarie 25, 2009, 00:14:56
eu am folosit si in exteriorul structurii si a mers fara probleme :)
Cod:
bool operator<(const mystruct &a, const mystruct &b)
{       return (a.ceva<b.ceva);}

cum am folosit eu poate avea vreun efect global pentru semnul '<' si sa am erori in unele cazuri?



Titlul: Răspuns: SORT din STL
Scris de: Andrei Grigorean din Februarie 25, 2009, 00:20:43
Ce ai facut tu este cealalta modalitate de a defini operatorul <. Nu te va incomoda cu nimic faptul ca nu l-ai bagat in structura.


Titlul: Răspuns: SORT din STL
Scris de: alexandru din Martie 06, 2009, 10:38:24
Sper sa nu se supere nimeni , dar n-am mai vrut sa deschid un alt topic despre aproape acelasi lucru. Cum sortez o structura cu qsort()?.....Nu stiu cum sa fac suprogramul compare, daca ma poate ajuta cineva ;)


Titlul: Răspuns: SORT din STL
Scris de: Florian Marcu din Martie 06, 2009, 11:09:52
S-a mai discutat despre asta  aici (http://infoarena.ro/forum/index.php?topic=1932.0).  :)


Titlul: Răspuns: SORT din STL
Scris de: alexandru din Martie 06, 2009, 11:48:46
multumesc mult :D. Am  gasit si o alta metoda de a sorta, fara a pastra indicii :).....


Titlul: Răspuns: SORT din STL
Scris de: Preda Rares Mihai din Februarie 04, 2011, 15:51:38
Daca imi declar un vector<vector<int> > sol;

vectorul initial arata asa
cod:
4 6 2
2 1 3
3 6 5

dupa ce am facut sort(sol[ i ].begin(), sol[ i ].end(), cmp) am sortat elemente de pe fiecare linie
unde cmp este
cod:

bool cmp(const int x, const int y)
{
   return x < y;
}

2 4 6
1 2 3
3 6 5

si acum vreau sa sortez dupa dupa elementul de pe prima linie si va arata asa
cod:
1 2 3
2 4 6
3 6 5        cum as putea sa fac folosind sort din STL ? Multumesc anticipat !


Titlul: Răspuns: SORT din STL
Scris de: FMI Ciprian Olariu din Februarie 04, 2011, 19:35:15
Pentru cei care doresc mai multe detalii despre sortarea cu functia sort pe mai multe criterii cititi aici un post despre acest subiect al profesorului meu  :) Ce e important e sa stii forma standard sort(v,v+n,Ordonare()) sau sort(v+1,v+n+1,Ordonare()) daca tii vectorul de la 1 la n,iar in functia Ordonare() bagi toate criteriile de care ai nevoie in if-uri si else-uri  :D  Cam la fel cred ca s-ar proceda si pe qsort,dar prefer sort.

http://www.dponline.ro/articol.php?idarticol=77 (http://www.dponline.ro/articol.php?idarticol=77)