簡體   English   中英

C++標准兼容庫容器的完整接口是什么?

[英]What is the complete interface of a C++ standard compatible library container?

我正在嘗試了解 C++ 標准庫。 如果我想構建一種與最新的 C++17 標准完全兼容的新型容器(不包括多態分配器支持,因為我還不是很清楚),並且與迭代器完全兼容,那么完整的成員函數和類型集是什么?必須提供?

以像 std::vector 這樣的序列容器為例。 換句話說,假設我想提供 std::vector 提供的一切。 還考慮分配器支持。

當然,我也想提供迭代器,就像 std::vector 所做的那樣(我不想委托給它;我想從頭開始重新制作),所以我想我需要兩個嵌套的迭代器類,一個用於iterator和一個用於const_iterator

我想出了以下幾點:

template <class T, class Alloc = std::allocator_traits<T>>
class StdLibClass
{
public:
    using allocator_type = Alloc;
    using value_type = typename Alloc::value_type;
    using reference = typename Alloc::reference;
    using const_reference = typename Alloc::const_reference;
    using difference_type = typename Alloc::difference_type;
    using size_type = typename Alloc::size_type;

    class Iterator
    {
    public:
        using difference_type = typename Alloc::difference_type;
        using value_type = typename Alloc::value_type;
        using reference = typename Alloc::reference;
        using pointer = typename Alloc::pointer;
        using iterator_category = std::random_access_iterator_tag;  // or another Iterator tag you want

        Iterator();
        Iterator(const Iterator&);
        ~Iterator();

        Iterator& operator=(const Iterator&);
        bool operator==(const Iterator&) const;
        bool operator!=(const Iterator&) const;
        bool operator<(const Iterator&) const;
        bool operator>(const Iterator&) const;
        bool operator<=(const Iterator&) const;
        bool operator>=(const Iterator&) const;

        Iterator &operator++();
        Iterator operator++(int);
        Iterator &operator--();
        Iterator operator--(int);
        Iterator &operator+=(size_type);
        Iterator operator+(size_type) const;
        friend Iterator operator+(size_type, const Iterator&);
        Iterator &operator-=(size_type);
        Iterator operator-(size_type) const;
        difference_type operator-(Iterator) const;

        reference operator*() const;
        pointer operator->() const;
        reference operator[](size_type) const;
    };

    class ConstIterator
    {
    public:
        using difference_type = typename Alloc::difference_type;
        using value_type = typename Alloc::value_type;
        using reference = typename const Alloc::reference;
        using pointer = typename const Alloc::pointer;
        using iterator_category = std::random_access_iterator_tag;  // or another Iterator tag you want

        ConstIterator();
        ConstIterator(const ConstIterator&);
        ConstIterator(const Iterator&);
        ~ConstIterator();

        ConstIterator& operator=(const ConstIterator&);
        bool operator==(const ConstIterator&) const;
        bool operator!=(const ConstIterator&) const;
        bool operator<(const ConstIterator&) const;
        bool operator>(const ConstIterator&) const;
        bool operator<=(const ConstIterator&) const;
        bool operator>=(const ConstIterator&) const;

        ConstIterator &operator++();
        ConstIterator operator++(int);
        ConstIterator &operator--();
        ConstIterator operator--(int);
        ConstIterator &operator+=(size_type);
        ConstIterator operator+(size_type) const;
        friend ConstIterator operator+(size_type, const ConstIterator&);
        ConstIterator &operator-=(size_type);
        ConstIterator operator-(size_type) const;
        difference_type operator-(ConstIterator) const;

        reference operator*() const;
        pointer operator->() const;
        reference operator[](size_type) const;
    };

    using ReverseIterator = std::reverse_iterator<Iterator>;
    using ConstReverseIterator = std::const_reverse_iterator<ConstIterator>;

    StdLibClass();
    ~StdLibClass();
    StdLibClass(const StdLibClass&);
    StdLibClass& operator=(const StdLibClass&);
    StdLibClass(const StdLibClass&&);
    StdLibClass& operator=(const StdLibClass&&);

    bool operator==(const StdLibClass&) const;
    bool operator!=(const StdLibClass&) const;
    bool operator<(const StdLibClass&) const;
    bool operator>(const StdLibClass&) const;
    bool operator<=(const StdLibClass&) const;
    bool operator>=(const StdLibClass&) const;

    Iterator begin();
    ConstIterator begin() const;
    ConstIterator cbegin() const;
    Iterator end();
    ConstIterator end() const;
    ConstIterator cend() const;
    ReverseIterator rbegin();
    ConstReverseIterator rbegin() const;
    ConstReverseIterator crbegin() const;
    ReverseIterator rend();
    ConstReverseIterator rend() const;
    ConstReverseIterator crend() const;

    reference front();
    const_reference front() const;
    reference back();
    const_reference back() const;

    template <class... TArgs>
    void emplace_front(TArgs &&...);
    template <class... TArgs>
    void emplace_back(TArgs &&...);
    void push_front(const T&);
    void push_front(T&&);
    void push_back(const T&);
    void push_back(T&&);
    void pop_front();
    void pop_back();
    reference operator[](size_type);
    const_reference operator[](size_type) const;
    reference at(size_type);
    const_reference at(size_type) const;

    template <class... TArgs>
    Iterator emplace(ConstIterator, TArgs&&...);
    Iterator insert(ConstIterator, const T&);
    Iterator insert(ConstIterator, T&&);
    Iterator insert(ConstIterator, size_type, T&);
    template <class Iter>
    Iterator insert(ConstIterator, Iter, Iter);
    Iterator insert(ConstIterator, std::initializer_list<T>);
    Iterator erase(ConstIterator);
    Iterator erase(ConstIterator, ConstIterator);
    void clear();
    template <class Iter>
    void assign(Iter, Iter);
    void assign(std::initializer_list<T>);
    void assign(size_type, const T&);

    void swap(StdLibClass &);
    size_type size() const;
    size_type max_size() const;
    bool empty() const;

    Alloc get_allocator() const;
};

// possibly want to specialize std::swap for the class too
namespace std
{

template <>
void swap<T, StdLibClass<T, Alloc>>(StdLibClass<T, Alloc>&, StdLibClass<T, Alloc>&);

} // namespace std

int main()
{

    return 0;
}

有些是我在互聯網上的網頁中找到的,有些是我通過挖掘標准庫標題找到的。 我是否缺少某些成員或其他概念?

我認為,根據您要實現的容器類型,C++20 中添加的新標准要求(標准概念)是尋找標准容器所需接口的好地方。

Container尤其是AllocatorAwareContainer的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM