c++ - C++标准兼容库容器的完整接口(interface)是什么?

标签 c++ interface stl containers c++-standard-library

我正在尝试了解 C++ 标准库。如果我想构建一种与最新的 C++17 标准完全兼容的新型容器(不包括多态分配器支持,因为我还不是很清楚),与迭代器完全兼容,完整的成员函数集是什么以及我必须提供的类型?

以像 std::vector 这样的序列容器为例。换句话说,假设我想提供 std::vector 提供的一切。还要考虑分配器支持。

当然我也想提供迭代器,就像 std::vector 做的那样(我不想委托(delegate)给它;我想从头开始重新制作),所以我想我需要两个嵌套的迭代器类,一个用于 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;
}

有些是我在 Internet 的网页中找到的,有些是我通过挖掘标准库标题找到的。我是否缺少某些成员或其他概念?

最佳答案

我认为,根据您要实现的容器类型,新的 standard requirements C++20 中添加的(标准概念)是查找标准容器所需接口(interface)的好地方。

Container 的示例特别是AllocatorAwareContainer

关于c++ - C++标准兼容库容器的完整接口(interface)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58202288/

相关文章:

c++ - 如何在 Windows 7 中安装 MinGW 64 位

c++ - OpenGL/GLM - 切换坐标系方向

c++ - Writefile 导致崩溃,访问冲突

class - 如何在 Object Pascal "class of interface"(或 "interface of interface")类型中创建

c++ - 在不提供参数类型的情况下绑定(bind)函数

c++ - Google Protocol Buffer 和对任意二进制数据使用 std::string

c++ - boost::asio::async_read 文本停止条件?

interface - 自动映射器 : Mapping to an Interface

java - 以标准化方式将对象传递给接口(interface)/抽象类

将值添加到 .h 中的映射时出现 C++ 错误