ejemplo c++ iterator stdmap

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.



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; }