Czy istnieją wytyczne, jak należy napisać nowy kontener, który będzie zachowywał się jak każdy STL
kontener?
c++
stl
c++-standard-library
Avinash
źródło
źródło
Odpowiedzi:
Oto sekwencja pseudo-pojemnik ja poskładane z § 23.2.1 \ 4 Uwaga, że
iterator_category
powinien być jedenstd::input_iterator_tag
,std::output_iterator_tag
,std::forward_iterator_tag
,std::bidirectional_iterator_tag
,std::random_access_iterator_tag
. Należy również pamiętać, że poniższe informacje są bardziej rygorystyczne pod względem technicznym niż jest to wymagane, ale taka jest idea. Zwróć uwagę, że zdecydowana większość „standardowych” funkcji jest technicznie opcjonalna, ze względu na niesamowity charakter iteratorów.Poza tym za każdym razem, gdy tworzę kontener, testuję z klasą mniej więcej taką:
Twórz pojemniki z
tester
przedmiotami i wywołuj każdy z nichfunction()
podczas testowania pojemnika. Nie twórz żadnychtester
obiektów globalnych . Jeśli twój kontener gdziekolwiek oszukuje, tatester
klasa to zrobiassert
i będziesz wiedział, że gdzieś przypadkowo oszukiwałeś.źródło
assert(tester::livecount == 0);
. Mmmmm, nadal nie jestem pewien, jak działa ta platforma testera. Czy mógłbyś podać przykład?memcpy
wydarzyło się żadne nieprawidłowe . (test nie jest niezawodny, ale trochę łapie).livecount
Jest prosty wykrywacz nieszczelności, aby upewnić się, że pojemnik o nazwie równej liczby konstruktorów i destruktorów.verifier
nie miałeś na myślivarifier
.std::iterator
nagłówka<iterator>
Będziesz musiał przeczytać sekcję C ++ Standard dotyczącą kontenerów i wymagań, które C ++ Standard nakłada na implementacje kontenerów.
Odpowiedni rozdział w standardzie C ++ 03 to:
Sekcja 23.1 Wymagania dotyczące kontenerów
Odpowiedni rozdział w standardzie C ++ 11 to:
Sekcja 23.2 Wymagania dotyczące kontenerów
Niemal ostateczny projekt standardu C ++ 11 jest dostępny bezpłatnie tutaj .
Równie dobrze możesz przeczytać kilka doskonałych książek, które pomogą Ci zrozumieć wymagania z punktu widzenia użytkownika kontenera. Dwie doskonałe książki, które z łatwością przyszły mi do głowy, to:
Effective STL byScott Meyers &
The C ++ Standard Library: A Tutorial and Reference autorstwaNicolai Josutils
źródło
Oto bardzo uproszczona implementacja fałszywego wektora, który jest w zasadzie opakowaniem
std::vector
i ma swój własny (ale prawdziwy) iterator, który naśladuje iterator STL. Ponownie, iterator jest bardzo uproszczony, pomijając wiele pojęć, takich jakconst_iterator
sprawdzanie poprawności itp.Kod można uruchomić po wyjęciu z pudełka.
źródło