O Padrão diz:
Um deque é um contêiner de sequência que suporta iteradores de acesso aleatório (27.2.7). Além disso, ele suporta operações de inserção e exclusão de tempo constante no início ou no final; inserir e apagar no meio leva tempo linear.
No entanto, também diz na mesma cláusula:
Todos os requisitos de complexidade desta Cláusula são declarados apenas em termos do número de operações nos objetos contidos. [Exemplo: o construtor de cópia do tipo
vector<vector<int>>
tem complexidade linear, mesmo que a complexidade de copiar cada um delesvector<int>
seja linear. - exemplo final]
Isso não significa que a inserção no início de, digamos, deque<int>
pode levar tempo linear , desde que não execute mais do que um número constante de operações nas int
s que já estão no deque e o novo int
objeto sendo inserido ?
Por exemplo, suponha que implementemos um deque usando um "vetor de vetores tamanho-K". Parece que uma vez a cada K vez que inserimos no início, um novo vetor tamanho-K deve ser adicionado no início, para que todos os outros vetores tamanho-K sejam movidos. Isso significaria que a complexidade temporal da inserção no início é amortizada O (N / K), onde N é o número total de elementos, mas K é constante, portanto, esse é apenas O (N). Mas parece que isso é permitido pelo Padrão, porque mover um vetor tamanho K não move nenhum de seus elementos e os "requisitos de complexidade" são "declarados apenas em termos do número de operações" nos int
objetos contidos .
O Padrão realmente permite isso? Ou devemos interpretá-lo como tendo um requisito mais rigoroso, ou seja , número constante de operações nos objetos contidos mais tempo adicional constante?
vector<vector<int>>
mas depois linear com relação aos elementos do interior vector<int>
. Se você considerar apenas o número de elementos do vetor externo hte, eu consideraria copiar o vetor interno como constante, embora possa estar errado, já está atrasado aqui