ejemplo - list iterator c++
¿Std:: map:: iterator devuelve una copia de valor o un valor en sí mismo? (4)
El value_type
un mapa es un par y, por lo tanto, tiene miembros primero y segundo. Al igual que con todos los iteradores, un iterador de mapa es un pseudo puntero, es decir, apunta a datos dentro de una colección y no a copias de esos datos.
Es casi seguro que internamente contenga punteros en lugar de referencias debido al hecho de que los iteradores pueden ser reasignados (para eso los usa) y no puede reasignar referencias para referirse a otros objetos.
Incluso si tiene un const_iterator y el tipo debajo es POD, debe tener un puntero, en caso de que alguien haga esto:
map< int, int > m;
m.insert( make_pair( 1, 2 );
map<int,int>::const_iterator citer = m.begin();
map<int,int>::iterator iter = m.begin();
iter->second = 3;
std::cout << citer->second << ''/n''; // should always print 3
El comportamiento debe estar definido y debe generar 3, lo que no ocurriría si el const_iterator decidiera "optimizar" después de todo es constante y solo int ...
Estoy tratando de crear un mapa dentro de un mapa:
typedef map<float,mytype> inner_map;
typedef map<float,inner_map> outer_map;
¿Podré poner algo dentro del mapa interno, o iterador :: segundo devuelve una copia?
stl_pair.h sugiere este último:
74: _T2 second; ///< @c second is a copy of the second object
pero mi programa de prueba funciona bien con el código como este:
it = my_map.lower_bound(3.1415);
(*it).second.insert(inner_map::value_type(2.71828,"Hello world!");
Entonces, ¿dónde está la verdad? ¿Es esto una copia o no?
El comentario en stl_pair.h
es engañoso en este caso específico.
No habrá copia, ya que map::iterator
realmente hace referencia a los datos originales dentro del mapa (el value_type
, que en sí es un pair
), no es una copia. Así iterator::second
también se refiere a los datos originales.
Los iteradores, cuando no están referenciados, te dan una referencia .
Quiero agregar una respuesta de seguimiento a esta pregunta para las personas que usan iteradores de C ++ 11 ...
El siguiente código:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (auto i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
copia la clave y el valor ya que "auto" es un valor por defecto, no una referencia constante (al menos así es como se comporta en Clang 3.1).
Además, el código:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const std::pair<std::string,std:string>& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
También copia la clave y el valor, ya que el código correcto debe ser:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const auto& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
o
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const std::pair<const std::string,std:string>& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}