Exercícios para Casa
Algumas perguntas mais avançadas sobre contêiners.
Vector
Perguntas Teóricas
Em algum momento, std::vector
vai alterar a ordem dos elementos serem inseridos?
Resposta
Não, o `std::vector` é um contêiner sequencial e os elementos são armazenados e acessados na mesma ordem em que são inseridos.Qual função é usada para inserir itens em um std::vector
e onde o objeto é inserido?
Resposta
O método `push_back()` insere elementos no final do vetor.Qual função obtém o número de elementos armazenados em um std::vector
?
Resposta
O método `size()` retorna o número de elementos armazenados em um vetor. A propósito, isso é verdade para todos os contêiners da STL.Prática (sem resposta)
- Escreva um programa que lê inteiros da entrada e saída e guarda os mesmos em um
std::vector
. - Após ler uma certa quantidade de elementos, faça seu programa receber uma entrada do usuário e imprima
sim
caso esta entrada esteja nostd::vector
. - Escreva uma classe
Pedido
que deve guardar: (1) o nome do usuário que fez o pedido e (2) umstd::vector
de outra classe, chamadaProduto
. A classeProduto
por sua vez deve conter o nome e preço de cada produto. Na classe pedido, implemente três métodos. Um para inserir um novo produto, outro para desfazer a última inserção (apagar a última inserção do vector), e um para imprimir todos os produtos do pedido.
Set
Perguntas teóricas
O que aconteceria se, em um std::set
de strings, eu inserisse a string “Jack” duas vezes?
Resposta
Um `std::set` não deve ser usado para inserir valores não exclusivos. Assim, a implementação da classe std::`std::set` não permitiria a inserção do segundo valor.No exemplo anterior, se eu quisesse ter duas instâncias de “Jack”, o que eu mudaria?
Resposta
Por padrão, um `std::set` contém apenas valores únicos. Você precisaria mudar sua seleção do container para um `std::multiset` (não discutido em aula) ou um `std::vector`.Encontrei um elemento no std::set
usando a função find
. Agora, tenho um iterador apontando para o elemto. Eu poderia usar este iterador para alterar o valor apontado?
Resposta
Não. Iteradores são constantes (ou deveriam ser, algumas versões de C++ alteram isso)Código
- Faça um programa simples que mostra que o
std::set
não suporta elementos repetidos. - Usando um
std::set
, faça uma função com a seguinte assinatura:std::set intersecao(int *dados_1, unsigned int n_dados_1, int *dados_2, unsigned int n_dados_2);
Em outras palavras, uma função que computa a interseção de dois vetores (aqui representados como ponteiros).
- Usando um
std::set
resolva o seguinte problema. Implemente uma função que recebe umstd::vector
e um parâmetrok
. Tal função deve retornar um número de sub-vetores do parâmetrodados
que somamk
.unsigned int num_sub_soma(std::vector<unsigned int> dados, int k);
Exemplo:
Entrada: dados = [1,1,1], k = 2 Saída: 2 Entrada: nums = [1,2,3], k = 3 Saída: 2
Lembre-se que o
std::set
é bom para busca. Sek=3
no caso acima, qual elemento preciso somar adados[0]
para quedados[0] + x == 3
?
Mapa
Perguntas teóricas
Qual é o comportamento esperado ao inserir um elemento no mapa duas vezes?
Resposta
Um mapa só pode ter uma chave. Então, ao inserir novamente a chave é trocada!Suponha que eu tenho um std::map<int, Pessoa>
que guarda uma pessoa para cada CPF. Como que você altera o nome da Pessoa sem remover a mesma do mapa?