potencia - Equivalente a set.pop() de python para los conjuntos desordenados de C++
operaciones set python (3)
¿C ++ tiene un equivalente a set.pop()
python? He estado buscando aquí la documentación de los unordered_set
, pero no parece que haya una forma de 1. Acceder a un elemento arbitrario, y / o 2. Acceder + eliminar un elemento arbitrario (reventar).
El equivalente es unordered_set.erase, creo. http://www.cplusplus.com/reference/unordered_set/unordered_set/erase/
Puedes hacer estallar el primer elemento
auto i = *set.begin();
set.erase(set.begin());
o si está demasiado preocupado por el orden interno definido por la implementación de los depósitos (sugerencia: probablemente no debería), podría eliminar un elemento aleatorio con algo así como
#include <unordered_set>
#include <iostream>
#include <random>
int main()
{
std::unordered_set<int> set{0, 1, 2, 3, 4, 5};
std::default_random_engine ran{std::random_device{}()};
auto it = set.begin();
std::advance(it, std::uniform_int_distribution<>{0, set.size() - 1}(ran));
std::cout << *it << ''/n'';
set.erase(it);
}
Sin embargo, lo anterior no es particularmente eficiente y puede que sea mejor llenando un std::vector
, eliminando los duplicados, aleatorizando el orden y luego simplemente pop_back
los elementos.
#include <algorithm>
#include <vector>
#include <iostream>
#include <random>
int main()
{
std::vector<int> vec{0, 1, 2, 3, 3, 4, 5, 5};
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
std::shuffle(
vec.begin(),
vec.end(),
std::default_random_engine{std::random_device{}()}
);
while (!vec.empty()) {
std::cout << vec.back() << ''/n'';
vec.pop_back();
}
}
(nb dependiendo de su plataforma random_device
puede no ser una muy buena semilla).
Tenga en cuenta que la biblioteca estándar de C ++ está diseñada intencionalmente para que las diversas especificaciones del contenedor no incluyan una función "obtener y eliminar": por ejemplo, para vector
, tiene back()
que devuelve el valor al final, y tiene pop_back()
que elimina el valor al final, pero no lo devuelve.
Las razones de esto bien podrían ser el contenido de una pregunta separada.
Entonces, lo que realmente quiere es un método para obtener un elemento (por ejemplo, begin()
como se sugiere en los comentarios), y luego eliminarlo una vez que lo haya obtenido (por ejemplo, erase(iterator)
como se menciona en la otra respuesta).