2010-09-20 10 views
5

tengo una estructuraUna estructura de datos eficiente para sostener variable de estructura con la clasificación de la capacidad de

struct dbdetails 
{ 
    int id; 
    string val; 
}; 

necesito una estructura de datos en C++ que puede contener variable de estructura con una capacidad de clasificación. ¿Es posible? Estaba mirando vector, que puede contener variable de estructura, pero no podré ordenarlo basado en id, porque es un miembro de estructura. ¿Alguna sugerencia?

+6

'try' es una palabra clave reservada en C++. ¿Estás seguro de que esta 'struct' se llama" try? " –

+0

No, solo estaba tratando de citar un ejemplo. No estoy usando try. Se llama dbdetails en mi programa. – sethu

+0

Oh, está bien. He editado la pregunta para incluir ese nombre, para que no cause un error de compilación. –

Respuesta

6

Es necesario un funtor a medida para comparar sus intentos. Esto debería hacer el truco:

#include <algorithm> 
#include <vector> 
// try is a keyword. renamed 
struct sorthelper : public std::binary_function<try_, try_, bool> 
{ 
    inline bool operator()(const try_& left, const try_& right) 
    { return left.id < right.id; } 
}; 

... 
std::vector<try_> v; 
// fill vector 
std::sort(v.begin(), v.end(), sorthelper()); 
... 

No dude en preguntar si tiene alguna pregunta de seguimiento. ¿Tienes el libro de Stroustrup?

Editar: Sugerencia de Matteo:

struct try_ 
{ 
    int id; 
    string val; 
    bool operator<(const try_& other) const 
     {return id < other.id;} 

}; // no s here plz. 

... 
std::vector<try_> v; 
// fill vector 
std::sort(v.begin(), v.end()); 
... 
+2

Una alternativa puede ser definir un operador menos como miembro de la estructura y evitar escribir comparadores personalizados. –

0

Puede ordenar un vector basado en los miembros de struct. Solo necesita un comparador personalizado.

1

puede ordenar una vector de struct 's y luego clasificarlos como:

std::sort(vectStruct.begin(), vectStruct.end(), &vectStructSort); 

bool vectStructSort(Try const& lhs, Try const& rhs) { // try is keyword. 
    return lhs.id < rhs.id; 
} 
+0

Realmente no entendí el uso de try reservado. Editado esto en mi publicación. –

1

Depende por lo que los requisitos que tiene en su contenedor de datos. Puede encontrar útil un conjunto (en Stl, Establecer es un contenedor asociativo ordenado para almacenar objetos de tipo Clave). O incluso un conjunto Hash o una matriz ordenada.

Si sabe que necesita ordenar sus elementos, quizás sea mejor usar un contenedor clasificado, en lugar de ordenarlo cada vez que lo necesite.

+0

El conjunto de hash/mapa no está ordenado, AFAIK. Brindan una búsqueda rápida, pero están desordenados y no pueden pedirse. –

4

Puede usar std::map. Están ordenados por clave, por lo que podían hacer:

std::map<int, std::string> myStuff; 

Este es un mapa con un int como llave y std::string como valor. Cuando iteras sobre el mapa, verás que está ordenado automáticamente por la clave.

Tenga en cuenta que ya no necesitará su struct con esta solución. Si necesita los datos en un struct (quizás para interactuar con alguna biblioteca externa), siempre puede copiar los datos del map en un struct según sea necesario.

1

Todos los contenedores ordenados (std::set, std::map, std::multiset, std::multimap) son, bien, ordenados. Los contenedores no ordenados (std::list, std::vector, std::deque) se pueden pedir proporcionando una función de comparación usando std::sort (vector, deque) o proporcionando ese comparador a un método miembro (lista).

Todo se reduce a lo que realmente necesita. Si necesita mantener los elementos ordenados en todo momento, un contenedor clasificado podría ser más eficiente que modificar el contenedor y recurrir. Por otro lado, si no es necesario tener el contenedor ordenado en todo momento, sino que es posible modificar los elementos, es posible que prefiera un vector. Los contenedores ordenados mantienen las claves como objetos constantes, ya que la modificación de las claves rompería la invariante de ordenación.

En algunos casos, el contenedor debe ordenarse en todo momento, pero no cambia después de algunas fases de inicialización.En ese caso, un contenedor no clasificado que se clasifica después de la inicialización puede estar bien.

Cuestiones relacionadas