Multiset c++ com capacidade limitada

7 respostas
rodrigo.bossini

Oi pessoal,

Tem como limitar o número de elementos que um multiset pode conter? Eu gostaria de criar um multiset cuja capacidade seja limitada por um inteiro n que eu informar. Assim, se na hora da inserção já existirem n elementos, o novo elemento será inserido somente se ele for menor do que pelo menos um outro já existente no multiset…e o menor deles será excluído do multiset. Tem algum jeito “pronto” de fazer isso?

7 Respostas

ViniGodoy

Que eu saiba isso não existe.
Mesmo o max_size é apenas para informar um limite teórico.

agosti

Olá,

Como o ViniGodoy comentou também não conheço esse recurso no multiset padrão do C++.
Acredito que você tenha que fazer esse controle em seu código mesmo.

att

E

rodrigo.bossini:
Oi pessoal,

Tem como limitar o número de elementos que um multiset pode conter? Eu gostaria de criar um multiset cuja capacidade seja limitada por um inteiro n que eu informar. Assim, se na hora da inserção já existirem n elementos, o novo elemento será inserido somente se ele for menor do que pelo menos um outro já existente no multiset…e o menor deles será excluído do multiset. Tem algum jeito "pronto" de fazer isso?

A maneira mais simples de fazer isso é estender o template multiset<>, efetuando um override nos métodos insert (cuidado que há três overloads desse método, pelo menos). Pronto não tem, até porque você não fez a especificação direito do que você quer.

Digamos que você tem o seguinte multiset com n = 4 elementos (nem estou usando elementos repetidos para simplificar o exemplo) :

1, 2, 3, 4

Você quer inserir o valor 1. Ele é menor que pelo menos algum outro já existente (ele é menor que 2, 3, e 4). Portanto, ele pode ser inserido, mas então você tem de remover o valor 1 que é o menor possível, e então ele será excluído do multiset. O resultado seria então 1, 2, 3, 4. É isso mesmo?

Agora, você quer inserir o valor 0. Ele é menor que o menor dos elementos, então ele pode ser inserido.

Mas pela sua especificação, você quer excluir o menor dos elementos que já estão no multiset, e o resultado seria:

0, 2, 3, 4

É isso mesmo? Cheira um pouco mal.

E

Se eu fosse fazer um multiset com capacidade limitada, provavelmente você teria de indicar a política para remover elementos.

Por exemplo, se você vai inserir em um multiset, provavelmente você descartaria o maior elemento que ficou depois da inserção ou então o menor elemento que ficou depois da inserção.

Por exemplo, dado o multiset 1, 2, 3, 4 com n = 4, e supondo que devemos sempre descartar o maior elemento, então ao acrescentarmos o valor 5, que é maior que todos os elementos, o multiset resultante seria 1, 2, 3, 4, 5, mas limitado pelo valor n = 4, o valor resultante seria 1, 2, 3, 4 no final das contas.
Supondo que devemos sempre descartar o menor elemento, se acrescentarmos o valor 5, o resultante seria 2, 3, 4, 5.

rodrigo.bossini

entanglement:
rodrigo.bossini:
Oi pessoal,

Tem como limitar o número de elementos que um multiset pode conter? Eu gostaria de criar um multiset cuja capacidade seja limitada por um inteiro n que eu informar. Assim, se na hora da inserção já existirem n elementos, o novo elemento será inserido somente se ele for menor do que pelo menos um outro já existente no multiset…e o menor deles será excluído do multiset. Tem algum jeito "pronto" de fazer isso?

A maneira mais simples de fazer isso é estender o template multiset<>, efetuando um override nos métodos insert (cuidado que há três overloads desse método, pelo menos). Pronto não tem, até porque você não fez a especificação direito do que você quer.

Digamos que você tem o seguinte multiset com n = 4 elementos (nem estou usando elementos repetidos para simplificar o exemplo) :

1, 2, 3, 4

Você quer inserir o valor 1. Ele é menor que pelo menos algum outro já existente (ele é menor que 2, 3, e 4). Portanto, ele pode ser inserido, mas então você tem de remover o valor 1 que é o menor possível, e então ele será excluído do multiset. O resultado seria então 1, 2, 3, 4. É isso mesmo?

Agora, você quer inserir o valor 0. Ele é menor que o menor dos elementos, então ele pode ser inserido.

Mas pela sua especificação, você quer excluir o menor dos elementos que já estão no multiset, e o resultado seria:

0, 2, 3, 4

É isso mesmo? Cheira um pouco mal.

É verdade, minha explicação ficou muito ruim por que usei a palavra menor duas vezes. E em uma delas eu queria ter usado “maior”. O que eu quero, na verdade, é que no meu multiset com capacidade limitada um elemento somente possa ser inserido se ele for maior do que pelo menos um elemento existente no multiset, ou se houver espaço vago ainda. E se um elemento for inserido e o multiset ficar cheio, então o menor existente deve ser descartado.

rodrigo.bossini

entanglement:
Se eu fosse fazer um multiset com capacidade limitada, provavelmente você teria de indicar a política para remover elementos.

Por exemplo, se você vai inserir em um multiset, provavelmente você descartaria o maior elemento que ficou depois da inserção ou então o menor elemento que ficou depois da inserção.

Por exemplo, dado o multiset 1, 2, 3, 4 com n = 4, e supondo que devemos sempre descartar o maior elemento, então ao acrescentarmos o valor 5, que é maior que todos os elementos, o multiset resultante seria 1, 2, 3, 4, 5, mas limitado pelo valor n = 4, o valor resultante seria 1, 2, 3, 4 no final das contas.
Supondo que devemos sempre descartar o menor elemento, se acrescentarmos o valor 5, o resultante seria 2, 3, 4, 5.

Se eu for estender o multiset, onde essa política de remoção ficaria? Na sobrescrita do método insert mesmo?

E

Aí fica a seu gosto. Por exemplo, você poderia incluir no construtor de sua classe um bool que indicasse se ele tem de remover o menor ou o maior elemento.

Criado 17 de abril de 2012
Ultima resposta 17 de abr. de 2012
Respostas 7
Participantes 4