Pergunta

Uma vez que não há nenhuma função membro .Resize () em C ++ std :: map Eu estava pensando, como se pode obter um std :: map com no máximo n elementos.

A solução óbvia é a de criar um circuito de 0 a n e usar a iteração enésimo como o primeiro parâmetro para std :: erase ().

Eu queria saber se existe alguma solução que não precisa do loop (pelo menos não no meu código de usuário) e é mais "o caminho STL para ir".

Foi útil?

Solução

Você pode usar std::advance( iter, numberofsteps ) para isso.

Outras dicas

solução universal para quase qualquer recipiente, tal como std :: lista, std :: map, boost :: multi_index. Você deve verificar o tamanho de apenas seu mapa.

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());
}

A maneira correta para isso é usar std :: antecedência. Mas aqui é uma maneira engraçada (lento) que permite 'redimensionamento utilização no mapa'. Mais geralmente, este tipo de truque pode ser usado para outras coisas que trabalham no vector, mas não no mapa.

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());

A std :: mapa não é uma lista. Não há elementos "primeiro n".

BTW: Iterators ficar inválido se o recipiente for alterado

.

Se você realmente precisa de um mapa menor você poderia interagir embora e adicionar todos os elementos até o n-th em um novo mapa.

Por que você quer para redimensionar um mapa?

Os elementos em um mapa não são armazenados em qualquer ordem - o primeiro 'n' não significa realmente nada

edit:
Curiosamente std :: mapa tem um fim, não tenho certeza o quão útil este conceito é.
São as entradas na mesma ordem de classificação como as chaves?
O que isso significa? Se você tiver nomes digitados pelo SSN isso significa que os nomes são armazenados em ordem numérica SSN?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top