¿Existe un contenedor auto-limpiante o similar que limite sus entradas a k ocurrencias?
Vector auto-limpiante.
Estoy buscando un tipo de dato similar a vector<T>
o stack<T>
, que recibe entradas de tipo <template T>
, donde cada entrada ocurre un máximo de k veces. Si se supera k, se eliminan todas las ocurrencias por encima de k.
davy.ai
Una solución potencial a su problema podría ser crear un vector de auto-limpieza. Esto puede lograrse mediante la creación de una subclase
vector<t>
y añadiendo una variable de miembromax_occurrences
para establecer el límite en el número de ocurrencias. Además, se puede anular el métodopush_back
para comprobar si se ha alcanzado el límite para un elemento específico y eliminar cualquier exceso de ocurrencias.Aquí hay una implementación de ejemplo:
“`c++ {
template
class SelfCleaningVector : public std::vector
public:
SelfCleaningVector(int max_occurrences) : max_occurrences(max_occurrences) {}
void push_back(const T& value) {::push_back(value); ::push_back(value);
int count = std::count(this->begin(), this->end(), value);
if (count < max_occurrences) {
std::vector
} else if (count == max_occurrences) {
std::vector
clean(value);
}
}
private:
int max_occurrences;
void clean(const T& value) {
for (auto it = this->begin(); it != this->end();) {
if (*it == value) {
it = this->erase(it);
} else {
++it;
}
}
}
};
“`
En esta implementación, creamos una subclase
vector<t>
y creamos un constructor que toma el número máximo de ocurrenciasmax_occurrences
. Luego, anulamos el métodopush_back
para comprobar primero si el recuento del valor es menor que el número máximo de ocurrencias. Si es así, agregamos el valor al vector como normal. Si ya ha ocurridomax_occurrences
veces, agregamos el valor al vector y llamamos al métodoclean
.El método
clean
utiliza un iterador para recorrer el vector y eliminar cualquier exceso de ocurrencias del valor. Esto se hace mediante la eliminación del elemento en el iterador si es igual al valor e incrementando el iterador si no lo es.En general, esta implementación proporciona un vector de auto-limpieza que se puede utilizar para asegurarse de que ningún elemento ocurra más de un número especificado de veces.