As diretrizes para escrever um contêiner STL personalizado
Ao projetar um novo contêiner que cumpra as convenções STL, é crucial seguir certas diretrizes para garantir seu comportamento adequado e integração com a biblioteca STL.
Interface do Iterador:
- Defina uma classe de iterador com uma tag iterator_category apropriada, como input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirecional_iterator_tag ou random_access_iterator_tag.
- Forneça funções de membro para comparação (==, !=), incremento/decremento ( , --), aritmética ( , -) e desreferenciação (*, ->) operações.
Const Iterator:
- Fornece uma classe const_iterator aninhada na classe do iterador, permitindo a iteração em contêineres constantes.
- Defina as mesmas funções de membro que o iterador não const, mas com referências const e ponteiros.
Comparação e atribuição:
- Implementar operadores de comparação (==, !=, , =) para o próprio contêiner.
- Forneça um operador de atribuição que faça referência a outro contêiner.
Capacidade e Acesso:
- Inclua funções de membro como vazia(), tamanho(), max_size() para gerenciar o tamanho e a capacidade do contêiner.
- Forneça início(), fim( ), cbegin(), cend(), rbegin(), rend(), crbegin() e crend() para acessar iteradores que representam os elementos do contêiner.
- Defina funções como front(), back(), at() e operador[] para acessar ou modificar elementos.
Inserções e exclusões:
- Implemente emplace_front() , emplace_back(), push_front(), push_back(), pop_front() e pop_back() para inserção e exclusão de elementos.
- Forneça emplace(), insert(), e funções de membro erase() para inserir e remover elementos dentro do contêiner.
Diversos:
- Inclua uma função de membro swap() para trocar o conteúdo de dois contêineres do mesmo tipo.
- Implemente get_allocator() para recuperar o alocador associado ao contêiner.
- Defina um Função swap() independente para trocar contêineres do mesmo tipo.
Teste:
Para garantir a confiabilidade do seu contêiner, use uma classe de teste como a classe de teste fornecida para verificar se:
- A vida útil do objeto é gerenciada corretamente.
- As chamadas de função não modificam o estado do objeto inesperadamente.
- O contêiner funciona corretamente quando criado com e sem objetos globais.