Existem diretrizes sobre como escrever um novo contêiner que se comportará como qualquer STL
contêiner?
c++
stl
c++-standard-library
Avinash
fonte
fonte
Respostas:
Aqui está uma sequência pseudo-container I montado a partir de § 23.2.1 \ 4 Note que o
iterator_category
deve ser um dosstd::input_iterator_tag
,std::output_iterator_tag
,std::forward_iterator_tag
,std::bidirectional_iterator_tag
,std::random_access_iterator_tag
. Observe também que o abaixo é tecnicamente mais rigoroso do que o necessário, mas essa é a ideia. Observe que a grande maioria das funções "padrão" é tecnicamente opcional, devido à grandiosidade que são os iteradores.Além disso, sempre que faço um contêiner, testo com uma classe mais ou menos assim:
Faça recipientes de
tester
objetos e chame cada um deles aofunction()
testar seu recipiente. Não faça nenhumtester
objeto global . Se o seu contêiner enganar em qualquer lugar, essatester
classe o faráassert
e você saberá que enganou acidentalmente em algum lugar.fonte
assert(tester::livecount == 0);
. Mmmmm, ainda não tenho certeza de como essa estrutura de testador funciona. Você poderia dar um exemplo?memcpy
aconteceu. (teste não é infalível, mas pega alguns). Olivecount
é um detector de vazamento simples, para garantir que seu contêiner chame um número igual de construtores e destruidores.verifier
não quis dizervarifier
.std::iterator
do cabeçalho<iterator>
Você precisará ler a seção Padrão C ++ sobre Contêineres e requisitos que o Padrão C ++ impõe para implementações de contêiner.
O capítulo relevante no padrão C ++ 03 é:
Seção 23.1 Requisitos de contêiner
O capítulo relevante no padrão C ++ 11 é:
Seção 23.2 Requisitos do contêiner
O rascunho quase final do padrão C ++ 11 está disponível gratuitamente aqui .
Você também pode ler alguns livros excelentes que ajudarão a entender os requisitos de uma perspectiva do usuário do contêiner. Dois excelentes livros que me impressionaram facilmente são:
STL eficaz porScott Meyers e
The C ++ Standard Library: um tutorial e referência porNicolai Josutils
fonte
Aqui está uma implementação muito simplista de um vetor falso, que é basicamente um invólucro
std::vector
e possui seu próprio (mas real) iterador, que imita o iterador STL. Novamente, o iterador é muito simplista, pulando muitos conceitosconst_iterator
, como verificações de validade etc.O código é executável imediatamente.
fonte