programa potencia operaciones lista funciĆ³n entre diferencia conjuntos conjunto codigo python c++ set unordered-set

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).



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).