Jump to content
Tonne

Ordenar Array de Objectos

Recommended Posts

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

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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));

Edited by 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."

Share this post


Link to post
Share on other 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;
}

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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.

Edited by 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."

Share this post


Link to post
Share on other 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 ?

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other sites
HappyHippyHippo

vês como consegues dar um exemplo concreto que o @Tonne consegue usar!

demorou mas foste lá :P


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

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other 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);
}

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other sites
Tonne

Agora esta me a dar erro no operador < , diz que é invalido e eu comentei-o e continua a dar o mesmo erro

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other sites
Tonne

a variavel vecLocais esta como variavel global da classe.

E que esta me a dar esse erro e eu não sei como é que o vou resolver

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.