¿Puedo construir un std::map
donde el tipo de clave es un tipo de referencia, p. Foo &
y si no, ¿por qué no?¿Se puede usar un tipo de referencia como tipo de clave en un mapa STL?
Respuesta
Según C++ Estándar 23.1.2/7 key_type
debe ser asignable. El tipo de referencia no es
No, porque muchas de las funciones de std :: map toman como referencia el tipo de clave y las referencias a las referencias son ilegales en C++.
/A.B.
Considere el operator[](const key_type & key)
. Si key_type
es Foo &
entonces ¿qué es const key_type &
? El problema es que no funciona. No puede construir un std :: map donde el tipo de clave es un tipo de referencia.
puntero como un tipo clave para std :: mapa es perfectamente legal
#include <iostream>
#include <cstdlib>
#include <map>
using namespace std;
int main()
{
int a = 2;
int b = 3;
int * c = &a;
int * d = &b;
map<int *, int> M;
M[c]=356;
M[d]=78;
return 0;
}
referencias no pueden estar inicializado claves:
#include <iostream>
#include <cstdlib>
#include <map>
using namespace std;
int main()
{
int a = 2;
int b = 3;
int & c = a;
int & d = b;
map<int &, int> M;
M[c]=356;
M[d]=78;
return 0;
}
In file included from /usr/include/c++/4.4/map:60,
from test.cpp:3:
/usr/include/c++/4.4/bits/stl_tree.h: In instantiation of 'std::_Rb_tree<int&, std::pair<int&, int>, std::_Select1st<std::pair<int&, int> >, std::less<int&>, std::allocator<std::pair<int&, int> > >':
/usr/include/c++/4.4/bits/stl_map.h:128: instantiated from 'std::map<int&, int, std::less<int&>, std::allocator<std::pair<int&, int> > >'
test.cpp:14: instantiated from here
/usr/include/c++/4.4/bits/stl_tree.h:1407: error: forming pointer to reference type 'int&
'
Tenga en cuenta que el orden basado en punteros no es determinista y es probable que cambie con cada invocación del programa. –
Sin mencionar que las claves se comparan por igualdad, por lo que esto es comparar los valores de la dirección del puntero al hacer una búsqueda, y no comparar el valor del puntero. Específicamente, en este ejemplo si hubiera otro int e = 2, y usted buscó M [ee], no obtendría lo que podría pensar que está buscando. – mmocny
- 1. Usar el par como clave en un mapa (C++/STL)
- 2. Usar tipo de datos (tipo de clase) como clave en un mapa
- 3. ¿Se puede usar una clase abstracta como tipo de referencia?
- 4. tipo de clase como clave en el mapa de Scala
- 5. ¿Se puede pasar un "tipo" como argumento?
- 6. ¿Puede un tipo ser un tipo de referencia y un tipo de valor al mismo tiempo?
- 7. referencia como clave en std :: mapa
- 8. no puede encontrar un (Mapa) deserializer clave para el tipo [tipo simple, com.comcast.ivr.core.domain.AutoHandlingSlotKey clase]
- 9. C++ :: mapa STL borrar un inexistente clave
- 10. ¿Se puede usar un boost :: shared_ptr como clave para un mapa?
- 11. ¿Puede AutoMapper Map entre un tipo de valor (Enum) y un tipo de referencia? (Cadena)
- 12. ¿Se considera Guid un tipo de valor o un tipo de referencia?
- 13. En Java, ¿se puede considerar "nulo" como un tipo primitivo?
- 14. En Java, ¿qué precauciones se deben tomar al usar un conjunto como clave en un mapa?
- 15. Al usar SplObjectStorage como un mapa de datos, ¿puede usar una matriz mutable como datos?
- 16. C++ const std :: referencia de mapa no se puede compilar
- 17. Tipo de referencia no puede encontrar el tipo público llamado
- 18. ¿Cómo se puede convertir a un tipo usando el nombre del tipo como una cadena?
- 19. Usando Delphi, no se puede usar el tipo anonymus como tipo de registro?
- 20. ¿Tipo de objeto tipo mapa en PL/SQL?
- 21. ¿Por qué no puedo usar tipos de referencia como el tipo de valor de un tipo de contenedor?
- 22. El tipo debe ser un tipo de referencia para usarlo como parámetro 'T' en el tipo o método genérico
- 23. mapa STL contiene referencias no se compila
- 24. Detectar si un tipo se puede derivar de en C++
- 25. El parámetro de tipo no se puede usar con los argumentos de tipo
- 26. ¿Mapa de STL sobre sí mismo?
- 27. ¿Se puede ejecutar MacOS en un entorno de tipo VMWare?
- 28. ¿Por qué es el 'esto' no de palabras clave de un tipo de referencia en C++
- 29. value_type para ver un mapa con punteros como clave
- 30. ¿Puede un tipo anónimo heredar de otro tipo?
1 Esta es una buena pregunta que muchos temen preguntar – laura
No directamente, pero 'boost :: reference_wrapper' debería funcionar. Tiene una conversión implícita a 'Foo &' –
MSalters