Worksheets07/10 - Logica Revisão
Total questions: 21
Worksheet time: 11mins
Qual é a principal função de um iterador em C++?
Gerenciar a alocação de memória do container.
Prover acesso direto e aleatório aos elementos de qualquer container.
Fornecer uma interface unificada para percorrer os elementos de diferentes containers (vetores, listas, mapas, etc.).
Garantir que os elementos do container sejam sempre únicos.
Qual tipo de iterador é o mais poderoso e é suportado por std::vector?
Input Iterator (Iterador de Entrada)
Bidirectional Iterator (Iterador Bidirecional)
Random Access Iterator (Iterador de Acesso Aleatório)
Forward Iterator (Iterador de Avanço)
O que o método end() de um container como std::vector retorna?
Um iterador para o último elemento válido no container.
Um iterador que pode ser desreferenciado para acessar o último elemento.
Um iterador past-the-end (após o final) que serve como condição de parada na iteração, mas não aponta para um elemento válido.
O valor do último elemento.
Em std::vector, quando ocorre a invalidação de iteradores que apontam para elementos existentes?
A. Apenas quando um elemento é removido.
B. Após uma inserção (push_back ou insert) que exige uma realocação da memória (quando a capacidade é excedida).
C. Nunca, os iteradores sempre permanecem válidos em vetores.
D. Apenas quando o vetor é copiado.
Qual operador é usado para avançar um iterador para o próximo elemento na maioria das categorias de iteradores?
* (Desreferenciação)
-> (Acesso a Membro)
++ (Incremento)
+ (Adição)
Qual dos seguintes operadores não pode ser sobrecarregado em C++?
O operador de atribuição (=).
O operador de chamada de função (()).
O operador de escopo de resolução (::).
O operador de incremento (++).
Ao sobrecarregar um operador binário como uma função membro de uma classe, quantos argumentos a função sobrecarregada recebe explicitamente?
Dois (o operando esquerdo e o operando direito).
Um (o operando direito, pois o operando esquerdo é o objeto implícito this).
Zero (o operador é unário por natureza).
Variável, dependendo do contexto.
Por que o operador de inserção de fluxo (operator<<), usado com std::cout, é geralmente sobrecarregado como uma função amiga (friend) não-membro?
Funções amigas têm acesso irrestrito aos membros privados da classe.
É a única maneira de retornar uma referência ao objeto ostream.
Para que o ostream (std::cout) possa ser o operando esquerdo (o primeiro argumento) na expressão.
Funções membro não podem lidar com referências a objetos de fluxo.
Qual é a assinatura correta para sobrecarregar o operador de incremento prefixado para uma classe Ponto?
Ponto operator++(int)
Ponto operator++()
const Ponto& operator++(Ponto&)
Ponto& operator++()
O que a sobrecarga correta do operador de atribuição (operator=) deve retornar?
void
Uma referência ao próprio objeto (*this), geralmente do tipo Classe&.
Uma cópia do objeto atribuído.
Um valor booleano indicando sucesso ou falha.
Qual é a principal característica da estrutura de dados subjacente de um std::vector?
Uma lista duplamente encadeada.
Uma estrutura de árvore balanceada.
Um array contíguo (sequencial) em memória.
Uma tabela de hash (hash map).
Em um std::vector, qual é a diferença entre os valores retornados por size() e capacity()?
size() é o número total de elementos que podem ser armazenados; capacity() é o número de elementos atualmente armazenados.
size() é o número de elementos atualmente armazenados; capacity() é o espaço de armazenamento total alocado na memória.
size() é o número de bytes usados; capacity() é o número de elementos.
Ambos retornam o mesmo valor, exceto após uma realocação.
Qual operação em um std::vector tem tipicamente a complexidade de tempo O(1) (tempo constante)?
Inserção de um elemento no início (insert(begin(), value)).
Acesso a um elemento usando o operador de índice (v[i]).
Remoção de um elemento no meio.
Redimensionar o vetor para uma capacidade menor (shrink_to_fit()).
Por que a operação de inserção ou remoção no início ou no meio de um std::vector é considerada lenta (O(n))?
Porque o vetor deve sempre ser reordenado após a inserção.
Porque a memória não é contígua e requer busca.
Porque todos os elementos subsequentes ao ponto de inserção/remoção precisam ser deslocados/copiados.
Porque causa uma realocação imediata da memória.
Qual método de std::vector é usado para solicitar que o vetor aloque memória suficiente para armazenar um certo número de elementos sem alterar seu tamanho atual (size)?
resize(n)
shrink_to_fit()
reserve(n)
capacity(n)
Qual é a estrutura de dados fundamental subjacente a um std::list?
Um array dinâmico.
Uma fila (queue) simples.
Uma lista duplamente encadeada.
Uma lista de arrays.
Qual operação é intrinsecamente mais eficiente em std::list (O(1)) do que em std::vector (O(n)) dado um iterador para o ponto de inserção?
A. Acesso aleatório por índice.
B. Inserção ou remoção de um elemento no meio.
C. Acesso ao primeiro elemento.
D. Iteração sequencial sobre todos os elementos.
Qual é a principal desvantagem de desempenho de std::list em comparação com std::vector?
Aloca mais memória devido ao armazenamento contíguo.
Pior localidade de cache e acesso aleatório O(n) (porque precisa percorrer do início).
Inserções e remoções no final são mais lentas.
Iteradores são sempre inválidos após qualquer operação.
Devido à sua estrutura, qual é o tipo de iterador mais poderoso que std::list suporta?
Random Access Iterator (Iterador de Acesso Aleatório)
Bidirectional Iterator (Iterador Bidirecional)
Forward Iterator (Iterador de Avanço)
Output Iterator (Iterador de Saída)
Em um cenário onde o número de elementos é grande, e a maioria das operações são inserções e remoções no meio da coleção, qual container é a escolha mais apropriada?
std::vector
std::array
std::deque
std::list
O que é invalidação de iteradores e qual operação comum em std::vector pode causar a invalidação de todos os iteradores e referências?
É quando operações como reallocação de memória (por exemplo, ao usar push_back que excede a capacidade) fazem com que todos os iteradores e referências se tornem inválidos.
É quando um iterador aponta para o início do vetor.
É quando um iterador é usado após o fim do vetor.
É quando um elemento é removido do início do vetor, mas os iteradores permanecem válidos.
