#include <algorithm> #include <vector> #include <string> using namespace std; vector <char> v_char; //Vector de char vector <string> v_str; //Vector de strings int v_int[1000]; //Vetor de inteiros int main() { int n; //n = tamanho do vetor sort(v_char.begin(), v_char.end()); //Soh ordenar n elementos sort(v_str.begin(), v_str.begin() + n); sort(v_int, v_int + n); }
Se quisermos ordenar em outra ordem ou ordenar um vetor de structs (não é trivial comparar), precisamos criar uma função de comparação. Um exemplo qualquer:
#include <algorithm> #include <vector> #include <stdio.h> using namespace std; struct node { int v_int; vector <char> p; double v_double; }; node vetor[25]; //Se compare retorna true, quer dizer que jah ta na ordem certa bool compare(const node &s1, const node &s2) { //O criterio que eu quero que seja usado //Quero que o maior double fique na frente if(s1.v_double != s2.v_double) return s1.v_double > s2.v_double; /*Isso eh equivalente a: if(a > b) return true; else if(a < b) return false; */ //Se os dois doubles forem iguais else if(s1.v_int != s2.v_int) { //Se A inteiro eh par, quero que ele fique na frente if(s1.v_int%2 == 0) return true; else return false; } //Se nao fica na frente quem tem mais chars no vetor else return s1.p.size() > s2.p.size(); } int main() { vetor[0].v_int = 3; vetor[0].v_double = 2.0; vetor[0].p.push_back('a'); vetor[1].v_int = 3; vetor[1].v_double = 3.0; vetor[2].v_int = 2; vetor[2].v_double = 2.0; vetor[3].v_int = 3; vetor[3].v_double = 3.0; vetor[3].p.push_back('b'); sort(vetor, vetor + 4, compare); for(int i = 0; i < 4; i++) { printf("%d %lf %lu\n", vetor[i].v_int, vetor[i].v_double, vetor[i].p.size()); } return 0; }
É possível também redefinir o operador de comparação. As funções usam o < ("menor que") para comparar, ou seja, para saber se deve trocar A com B, o compilador checa se A < B e se B < A. No caso de A == B, pode ser que ele troque ou não (arbitrário). Em alguns casos, é necessário definir um operador, como quando criamos uma priority_queue (fila de prioridade) em que a comparação não é trivial.
#include <queue> #include <vector> #include <stdio.h> using namespace std; struct novo_int { int val; bool operator < (const novo_int& i) const{ return val > i.val; } }; int main() { priority_queue<novo_int> pq; int aux; while(true) { novo_int tmp; scanf("%d", &tmp.val); pq.push(tmp); //Checando quem esta no topo de pq printf("%d\n", pq.top().val); } }
Uma variação é o stable_sort, que, no caso A == B, mantém na frente quem já está na frente.
Problemas relacionados:
URI 1244: Ordenação por Tamanho [link]
URI 1252: Sort! Sort!! e Sort!!! [link]
Códigos no github [link].
Vlw matheus sou iniciante em programação e estava tendo dificuldades com problemas da obi e da maratona, esse seu texto foi muito esclarecedor, obrigado.
ResponderExcluirLegal Bruno, obrigado! :)
Excluir