Pregunta

Como no hay una función miembro .resize () en C ++ std :: map, me preguntaba cómo se puede obtener un std :: map con un máximo de n elementos.

La solución obvia es crear un bucle de 0 a n y usar el iterador nth como primer parámetro para std :: erase ().

Me preguntaba si hay alguna solución que no necesite el bucle (al menos no en mi código de usuario) y es más " la manera de ir de STL " ;.

¿Fue útil?

Solución

Puedes usar std :: advance (iter, numberofsteps) para eso.

Otros consejos

Solución universal para casi cualquier contenedor, como std :: list, std :: map, boost :: multi_index. Debes verificar el tamaño de tu mapa solamente.

template<class It>
It myadvance(It it, size_t n) {
   std::advance(it, n);
   return it;
}

template<class Cont>
void resize_container(Cont & cont, size_t n) {
    cont.erase(myadvance(cont.begin(), std::min(n, cont.size())), 
                 cont.end());
}

La forma correcta de esto es usar std :: advance. Pero aquí hay una forma divertida (lenta) que permite "usar el cambio de tamaño en el mapa". Más generalmente, este tipo de truco puede usarse para otras cosas que trabajan en vectores pero no en mapas.

map<K,V> m; //your map
vector< pair<K,V> > v(m.begin(), m.end());
v.resize(n);
m = map<K,V>(v.begin(),v.end());

Un std :: map no es una lista. No hay " primero n " elementos.

BTW: Los iteradores se vuelven inválidos si se cambia el contenedor.

Si realmente necesitas un mapa más pequeño, puedes iterarlo y agregar todos los elementos hasta la enésima posición en un nuevo mapa.

¿Por qué quieres cambiar el tamaño de un mapa?

Los elementos de un mapa no se almacenan en ningún orden, la primera 'n' no significa nada

editar:
Es interesante que std :: map tiene un orden, sin estar seguro de lo útil que es este concepto.
¿Están las entradas en el mismo orden de clasificación que las claves?
Qué significa eso? Si tiene nombres marcados con SSN, ¿significa que los nombres se almacenan en orden numérico de SSN?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top