c++ - tipos - programa que lea los datos de n trabajadores y que imprima los datos del empleado por salario
¿Una población en tiempo de compilación de estructuras de datos que no sean matrices? (4)
No fácilmente, no. Si intentaste hacer tu primer ejemplo usando malloc
, obviamente no funcionaría en tiempo de compilación. Como cada contenedor estándar utiliza un new
(bueno, std::allocator<T>::allocate()
, pero fingiremos que es new
por ahora), no podemos hacer esto en tiempo de compilación.
Dicho esto, depende de la cantidad de dolor que esté dispuesto a atravesar y de la cantidad que desee rechazar para compilar el tiempo. Ciertamente no puedes hacer esto usando solo las características estándar de la biblioteca. Usando boost::mpl
por otro lado ...
#include <iostream>
#include "boost/mpl/map.hpp"
#include "boost/mpl/for_each.hpp"
#include "boost/mpl/string.hpp"
#include "boost/mpl/front.hpp"
#include "boost/mpl/has_key.hpp"
using namespace boost::mpl;
int main()
{
typedef string<''One '', ''fish''> strone;
typedef string<''Two '', ''fish''> strtwo;
typedef string<''Red '', ''fish''> strthree;
typedef string<''Blue'', ''fish''> strfour;
typedef map<pair<int_<555>, strone>,
pair<int_<666>, strtwo>,
pair<int_<451>, strthree>,
pair<int_<626>, strfour>> m;
std::cout << c_str<second<front<m>::type>::type>::value << "/n";
std::cout << has_key<m, int_<666>>::type::value << "/n";
std::cout << has_key<m, int_<111>>::type::value << "/n";
}
En C ++, puedes hacer esto:
static const char * [4] = {
"One fish",
"Two fish",
"Red fish",
"Blue fish"
};
... y eso le da una buena estructura de datos de matriz de solo lectura que no requiere ningún ciclo de CPU para inicializarse en tiempo de ejecución, porque todos los datos se han distribuido para usted (en las páginas de memoria de solo lectura del ejecutable) por el compilador
Pero, ¿y si prefiero usar una estructura de datos diferente en lugar de una matriz? Por ejemplo, si quisiera que mi estructura de datos tuviera búsquedas rápidas a través de una clave, tendría que hacer algo como esto:
static std::map<int, const char *> map;
int main(int, char **)
{
map.insert(555, "One fish");
map.insert(666, "Two fish");
map.insert(451, "Red fish");
map.insert(626, "Blue fish");
[... rest of program here...]
}
... lo que es menos elegante y menos eficiente ya que la estructura de datos del mapa se está llenando en tiempo de ejecución, aunque se conocieron todos los datos necesarios en el momento de la compilación y, por lo tanto, ese trabajo podría haberse realizado (teóricamente) en ese momento.
Mi pregunta es, ¿existe alguna forma en C ++ (o C ++ 11) para crear una estructura de datos de solo lectura (como un mapa) cuyos datos se configuren por completo en el momento de la compilación y, por lo tanto, se completen previamente y estén listos para usar en tiempo de ejecución, la forma en que una matriz puede ser?
Sí, C ++ 11 permite inicializadores de llaves:
std::map<int, const char *> map = {
{ 555, "One fish" },
{ 666, "Two fish" },
// etc
};
Si desea un mapa (o conjunto), considere usar un árbol binario almacenado como una matriz . Puede afirmar que se ordenó correctamente en el tiempo de ejecución en las versiones de depuración, pero en las versiones optimizadas puede asumir que todo está organizado correctamente y luego puede hacer el mismo tipo de operaciones de búsqueda binaria que en std :: map, pero con el subyacente el almacenamiento es una matriz. Simplemente escriba un pequeño programa para heapificar los datos por usted antes de pegarlos en su programa.
Vale la pena mencionar que su problema se debe al hecho de que está utilizando el mapa. Los mapas son a menudo utilizados en exceso. La solución alternativa a un mapa es un vector / matriz ordenado. Los mapas solo se vuelven "mejores" que los mapas cuando se usan para almacenar datos de longitud desconocida o (y solo en ocasiones) cuando los datos cambian con frecuencia.
Las funciones std :: sort, std :: lower_bound / std :: upper_bound son las que necesita. Si puede ordenar los datos usted solo necesita una función, lower_bound, y los datos pueden ser constantes.