Tipos abstratos e escolha da representação
Separar operações observáveis, invariantes da representação e custos concretos.
O que o cliente vê
Um TAD promete valores e operações. A representação escolhe campos e custos.
- Consulta de
ipede0<=i<size. Retirada da frente pede lista não vazia ou ausência explícita. - Invariante típico de lista simples: sem ciclos, termina em nulo, tem exatamente
tamanhonós.primeiroé nulo só no vazio. - Construtor cria o invariante. Cada método repõe-no. Destrutor liberta o que é possuído.
Vetor ou nós
| Precisas de | Prefere |
|---|---|
| Índice em e poucas inserções à frente | Vetor |
| Frente em e inserção após posição conhecida | Lista |
| Consultar o fim | Vetor, ou lista com cauda |
| Inserir no fim | Vetor em amortizado, ou lista com cauda em |
| Remover o fim | Vetor em ; na lista, duplamente ligada com cauda em , simples com cauda em pelo anterior |
A pesquisa binária corre sobre qualquer sequência ordenada, mas o custo logarítmico habitual exige acesso direto em . Numa lista ligada com iteradores de avanço, chegar ao meio já custa deslocações lineares, por isso o vetor ordenado é a escolha natural.
«Inserir em » só conta depois de teres a ligação. Localizar a posição pode dominar.
Quem liberta e o que invalida
- Não copies só o apontador inicial: dois donos libertam os mesmos nós.
vectorpode realocar ao inserir e nesse caso invalida tudo. Sem realocar, inserir invalida os iteradores da posição em diante.listconserva iteradores ao inserir; apagar invalida só os do elemento.ninserções emsetcustam . Hash com constantes esperadas dá linear esperado, não garantido.
Testa vazio, um elemento, repetidos e extremidades. Confere o invariante, não só a impressão final.