Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Tonne

Ordenar Array de Objectos

Mensagens Recomendadas

Tonne

Boa Tarde

Eu estou com dificuldades a ordenar um array com Objectos apartir da sua descrição que é um atributo de uma classe.

Estou a fazer da seguinte forma só que não consigo ordenar como eu fiz alguem me pode ajudar ?

O Código que eu tenho é que está a baixo:

LocaisTuristicos* aux = 0;
for(int i=0;i<countLocais;i++)
{
 for (int j=1;j<countLocais;j++)
 {
   if((vecLocais[i]->getDescricao()).compare(vecLocais[j]->getDescricao()))
   {
     aux = vecLocais[i];
     vecLocais[i]= vecLocais[j];
     vecLocais[j]=aux;
     j++;
   }else
   {
     j++;
   }
 }
}

Obrigado

Editado por Rui Carlos
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

isso é para containers, quando se tem um array, é mais fácil resolver simplesmente com C ...

ordenar : qsort

#include <cstring>
#include <cstdlib>

class LocaisTuristicos {
 static int sort_compare(const void * a, const void * b) {
   return ((LocaisTuristicos *) a) - ((LocaisTuristicos *) b);
 }

 int operator-(const LocaisTuristicos & lt) {
   return strcmp(this->getDescricao().c_str(), lt->getDescricao().c_str())
 }
}

// ...
qsort(vecLocais, sizeof(LocaisTuristicos), countLocais, LocaisTuristicos::sort_compare);
// ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

isso é para containers, quando se tem um array, é mais fácil resolver simplesmente com C ...

o std::sort nao e' so' para containers da stl...

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
int arr[10];
for(int i=0;i<10;i++)
	arr[i] = 10-i;

//nao ordenado!
for(int i=0;i<10;i++)
	cout<<arr[i]<<endl;

//ordenar
std::sort(arr,arr+10);

for(int i=0;i<10;i++)
	cout<<arr[i]<<endl;
cin.get();
}

para algo ainda mais facil, podemos usar o begin e o end, que fazem parte do standard de C++11.

std::sort(begin(arr),end(arr));

Editado por pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o std::sort nao e' so' para containers da stl...

usar o sort em casos particulares de arrays não é dizer que também é para tal ...

http://www.cplusplus.com/reference/algorithm/sort/

RandomAccessIterator shall point to a type for which swap is properly defined and which is both move-constructible and move-assignable.

isso funciona por causa do teu array ser contituido por elemento de um tipo natural da linguagem, o que não é o caso do problema original deste tópico.

exemplo:

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;

#define MAX 5

class Objecto {
public:
   Objecto(void) : _val("") {}

   string val(void) const { return this->_val; }
   string val(string value) { this->_val = value; return this->_val; }

protected:
   string _val;
};

int main() {
   Objecto * array = new Objecto[MAX];

   srand(time(NULL));

   for (int i = 0; i < MAX; i++) {
       stringstream buf;
       buf << "value : " << rand();
       array[i].val(buf.str());
   }

   for (int i = 0; i < MAX; i++) {
       cout << i << " >> " << array[i].val() << endl;
   }

   std::sort(array, array + MAX); // imaginas a quantidade de erros que isto origina na compilação ?????
                                  // vai ordenar como ? o compilador não sabe como ordenar os objectos

   for (int i = 0; i < MAX; i++) {
       cout << i << " >> " << array[i].val() << endl;
   }

   return 0;
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax
	std::sort(array, array + MAX); // imaginas a quantidade de erros que isto origina na compilação ?????
							   // vai ordenar como ? o compilador não sabe como ordenar os objectos

como e' que queres que o compilador saiba, pelo o que queres ordenar? o maximo que ele pode fazer com a informacao que lhe estas a dar e' odenar por memoria, e mesmo assim nao faz nenhum sentido...

std::sort(array, array + MAX, [](Objecto x,Objecto y)->bool{ return strcmp(x.val().c_str(), y.val().c_str());});
							   // vai ordenar como ? o compilador não sabe como ordenar os objectos --> E' por isso que temos que ensinar ao compilador.

Editado por pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

e perguntaste ao criador do tópico se está a usar c++11 ?

sabes que c++11 ainda não é o padrão para quem está a começar a programar ?

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Eu utilizei C++11 porque as lamdas dao jeito neste caso.

mas nada impede de passar para c++98

bool comp (Objecto x,Objecto y)
{
   return strcmp(x.val().c_str(), y.val().c_str());
}
//...

std::sort(array, array + MAX, comp);


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

em c++98, nao tem o glamour que o c++11 tem :D


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tonne

Eu tenho assim só que esta a dar erro :(

bool Central::comparar(LocaisTuristicos* x,LocaisTuristicos* y)
{
return strcmp(x->getDescricao().c_str(),y->getDescricao().c_str());
}
//Metodo que ordena Alfabeticamente Locais Naturais
void Central::ListarOrdemAlfabeticaLocais(LocaisTuristicos* *vecLocais){
std::sort(vecLocais,vecLocais + countLocais,comparar);
}

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

passa a funcao comparar para static.

static bool Central::comparar(LocaisTuristicos* x,LocaisTuristicos* y)
{
 return strcmp(x->getDescricao().c_str(),y->getDescricao().c_str());
}
//Metodo que ordena Alfabeticamente Locais Naturais
void Central::ListarOrdemAlfabeticaLocais(LocaisTuristicos* *vecLocais){
 std::sort(vecLocais,vecLocais + countLocais,Central::comparar);
}


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

em que linha esta a dar esse erro?


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

deixa-me ver a tua declaracao do vecLocais


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

quero saber onde estas a declarar a variavel que passas para a funcao


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

nao sei qual e' o tipo dessa variavel e qual e' o seu valor... infelizmente ainda nao sou bruxo.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
munkbozz

Pois coloca aqui o código integralmente ou onde é declarada a variável em questão, poderá existir diversas soluções ao problema com que te deparas...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tonne

//Classe onde se vai ler os Ficheiros e a criação de Objectos
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#include "LocaisTuristicos.h"
#include "LTuristicosNaturais.h"
#include "LTuristicosHistoricosCulturais.h"
#include "ViasLigacao.h"
#include "AutoEstradas.h"
#include "EstradaNacional.h"
int npost;
LocaisTuristicos* *vecLocais;
ViasLigacao* *vecVias;
int tam, countLocais, countVias;
class Central {
public:
 void LerFicheiro_LocaisTuristicos(string nomefich);
 void LerFicheiro_Vias(string nomefich);
 void ListarLocais();
 void ListarVias();
 void ListarOrdemAlfabeticaLocais(LocaisTuristicos* *vecLocais);
 void inserirLocais(LocaisTuristicos *local);
 void inserirVias(ViasLigacao *vias);
 bool VerificarseeAE(char *aux);
 void TotalLocais(LocaisTuristicos* *vecLocais);
 static bool comparar(LocaisTuristicos* x,LocaisTuristicos* y);
 void criarGrafo();
 Central();
 ~Central(); 
};
Central::Central(){
}
Central::~Central(){
}
bool Central::comparar(LocaisTuristicos* x,LocaisTuristicos* y)
{
return strcmp(x->getDescricao().c_str(),y->getDescricao().c_str());
}
//Metodo que ordena Alfabeticamente Locais Naturais
void Central::ListarOrdemAlfabeticaLocais(LocaisTuristicos* *vecLocais){
std::sort(vecLocais,vecLocais + countLocais,comparar);
}

Aqui esta o codigo tirei algum codigo porque era desnecessário

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
void Central::ListarOrdemAlfabeticaLocais(LocaisTuristicos* *vecLocais){
//                                                        A A
//                                                        | |
//                                                ponteiro de ponteiros ?
//                                      é claro que o compilador não sabe fazer essas contas


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.