2012-10-10 26 views
10

C++ Clasificación clase ArrayC++ Clasificación clase Array

Tengo un objeto array que grabar el siguiente ..

Esto es al classone.h

ClassOne 
{ 
string name; 
int data; 
float valueData; 
} 

y el constructor se crean en classone.cpp

En main.cpp Creé ClassOne Array of Size 10

#include "classone.h" 

ClassOne cone[10]; 

siguiente es i grabado varios valor al objeto

y ahora ClassOne tiene 3 objetos

cone[0] 
name = "hello" 
data = 1 
valueData = 20 

cone[1] 
name = "panda" 
data = 2 
valueData = 15 

cone[2] 
name = "joe" 
data = 3 
valueData = 25 

Lo que quiero lograr es hacer una especie que puede reorganizar esta matriz por valueData forma ascendente más alta así que ... será

cone[2] luego cone[0] luego cone[1] ..

pero el problema si uso ordenamiento de burbuja, he intentado Google y encontrar algunos, que está ordenando por ejemplo int a[]={9,6,5,23,2,6,2,7,1,8};

pero quiero ordenar por objeto array clase. y reorganizar el valor en conjunto, ¿cómo lo logro?

Así que cuando Coût será

-- Highest to lowest -- 
1) Name: Joe , Data = 3, Value =25 
2) Name: Hello , Data =1 , Value = 20 
3) Name: Panda, Data = 2, Value = 15 

Gracias por toda la ayuda y guía !!

+0

tantos voto sobre mi pregunta .. soy nuevo en C++. y realmente no sé cómo proceder. –

Respuesta

2

Debe definir un operador de comparación para su clase. La forma en que determina si un objeto es menor que otro no está claro a partir de su pregunta.

17

La forma más sencilla es utilizar la biblioteca estándar:

#include <algorithm> 

std::sort(cone, cone + 10, 
      [](ClassOne const & a, ClassOne const & b) -> bool 
      { return a.value < b.value; }); 

Si usted está dispuesto para definir un operador de comparación a nivel mundial, que ni siquiera necesita la lambda:

bool operator<(ClassOne const & a, ClassOne const & b) 
{ 
    return a.value < b.value; 
} 

std::sort(cone, cone + 10); 

O podría hacer que el comparador sea una función miembro. O podría darle a la función de comparador un nombre personalizado y pasarlo como el tercer argumento de sort. Esta podría ser una buena idea en el caso en que la comparación es específica para su situación y no "natural":

bool ValueCmp(ClassOne const & a, ClassOne const & b) 
{ 
    return a.value < b.value; 
} 

std::sort(cone, cone + 10, ValueCmp); 

La última versión es útil si usted no tiene C++ 11 soporte (por lambdas, como en el primer caso), o si desea reutilizar el comparador en múltiples situaciones diferentes.

+2

+1, nota para los lectores: el uso de lambdas es solo C++ 11. –

+0

No estoy seguro de cómo aplicar ordenar a mi objeto ... intenté con su ejemplo pero obtuve algunos errores ... –

+0

@baokychen: había escrito mal el nombre de la clase. Actualiza la página e intenta nuevamente. Deberia de funcionar. –

6

Uso std::sort y una adecuada función de clasificación/funtor:

bool comp(const ClassOne& lhs, const ClassOne& rhs) 
{ 
    return lhs.valueData < rhs.valueData; 
} 

std::sort(cone, cone+10, comp); 

o, en C++ 11,

std::sort(std::begin(cone), std::end(cone), comp); 
+0

Vi su guía en la biblioteca estándar, ¿cómo la uso con mi objeto de cono? –

+0

@baokychen igual que arriba. No tiene un objeto de cono, tiene una matriz de objetos 'ClassOne' llamada' cono ??. – juanchopanza

+0

Para mayor coherencia y claridad, sugiero usar el operador de dirección '&' para formar punteros de función, en lugar de la conversión implícita de función a puntero de función. –

3

mirada a su fuente especie de burbuja. En algún momento, se comparará un int con otro, probablemente con el operador menor que (<) o el operador mayor que (>). Ahí es donde la función de clasificación determina el orden relativo de esos dos elementos. Al repetir esa comparación muchas veces, la función de ordenación puede determinar el orden total de la colección.

Debe reemplazar esa operación con su propia función de comparación. Una función que toma dos objetos de su clase, y devuelve verdadero si el primero se debe considerar menos que el segundo, falso si el segundo se debe considerar menos que el primero, y falso si se deben considerar equivalentes.

5

Puede hacer una estructura que implementa el método operator < que std::sort utiliza en el encabezado <algorithm> para ordenar elementos iterados.

struct One { 
string name; 
int data; 
float valueData; 

bool operator < (const one &a) const{ 
return valueData <a.valueData; 
} 

}; 

entonces todo lo que tiene que hacer es hacer un arreglo de esta estructura y ordenarla usando la función de clasificación