Supongamos que alguna estructura de datos:referencia como clave en std :: mapa
typedef struct {
std::string s;
int i;
} data;
Si utilizo el campo data.s
como clave a la hora de añadir los casos de data
en un mapa de tipo std::map<std::string&, data>
, hacer la cadena se copia? ¿Es seguro borrar un elemento del mapa porque la referencia se invalidará?
También las respuestas a estas preguntas también se aplican a un unordered_map
?
EDIT:
Ésta es mi solución actual ... pero la adición de iterador para el mapa es FEO:
typedef struct {
const std::string* s;
int i;
} data;
std::map<std::string, data> map;
typedef std::map<std::string, data>::iterator iterator;
// add an element to the map
iterator add_element(const std::string& s) {
std::pair<iterator, bool> p = states.insert(std::make_pair(s, data()));
iterator i = p.first;
if(p.second) {
data& d = (*i).second;
d.s = &(*i).first;
}
return i;
}
Gracias por la respuesta. Si quiero evitar tener dos copias de la cadena, ¿debería usar una referencia en la 'struct data' en su lugar? –
Además, cuando dice que no puedo almacenar referencias, ¿quiere decir que el STL obliga a una copia? –
@Helltone Las referencias son difíciles de usar correctamente como miembros de estructuras o clases; eso no es realmente para lo que estaban destinadas. En su lugar, debe usar un puntero u omitir la cadena de la estructura por completo. –