如何为我的容器正确组织迭代器

问题描述

我正在尝试为我的容器实现迭代器,但有一些情况告诉我我走错了路,我想听听如何正确实现常量和反向迭代器。

此刻我停止了这种实现,但不幸的是我得到了一个错误

error: cannot convert 'Node<int>*' to 'Node<const int>*' in initialization
   73 | Iterator<Type>::Iterator(Node<TypeIter>* n_ptr) : data(n_ptr)

实现

//-------------------------------------------------------------------------------------------------
template <typename Type>
class Node
{
public:
    Type element;
    Node<Type>* prev;
    Node<Type>* next;
public:
    Node() : element(),prev(nullptr),next(nullptr) {};
    Node(const Type& elem,Node* prev,Node* next) : element(elem),prev(prev),next(next) {};
    Node(const Node& node) : Node(node.element,node.prev,node.next) {};
};
//-------------------------------------------------------------------------------------------------
template <typename Type>
class Iterator
{
public:
    using difference_type = std::ptrdiff_t;
    using value_type = std::remove_cv_t<Type>;
    using pointer = Type*;
    using reference = Type&;
    using iterator_category = std::random_access_iterator_tag;
    using iterator_concept = std::contiguous_iterator_tag;
public:
    Node<Type>* data;
public:
    explicit Iterator(Node<Type>* ptr = nullptr);
    Iterator(const Iterator& iterator);

    template<typename TypeIter>
    explicit Iterator(Node<TypeIter>* ptr = nullptr);
    template<typename TypeIter>
    explicit Iterator(const Iterator<TypeIter>& iterator);

    ~Iterator() = default;

    bool operator==(const Iterator& lhs) const;
    bool operator!=(const Iterator& lhs) const;

    Iterator operator++();
    Iterator operator++(int post);
    Iterator operator--();
    Iterator operator--(int post);

    Type& operator*();
};
//-------------------------------------------------------------------------------------------------
namespace std
{
    template <typename Type>
    struct iterator_traits<Iterator<Type>>
    {
        using difference_type = std::ptrdiff_t;
        using value_type = std::remove_cv_t<Type>;
        using pointer = Type*;
        using reference = Type&;
        using iterator_category = std::random_access_iterator_tag;
        using iterator_concept = std::contiguous_iterator_tag;
    };
} // namespace std
//-------------------------------------------------------------------------------------------------
template <typename Type>
class Deque
{
public:
    //Using
    using iterator = Iterator<Type>;
    using const_iterator = Iterator<const Type>;
    using reverse_iterator = std::reverse_iterator<iterator>;
    using const_reverse_iterator = std::reverse_iterator<const_iterator>;

据我了解,这与以下事实有关:我有2个不同的模板,一个带有const,另一个没有。

    using iterator = Iterator<Type>;
    using const_iterator = Iterator<const Type>;

Complete code

主要

int main()
{
    Deque<int> test;
    test.push_back(123);
    test.push_back(77);
    test.push_back(1);
    test.push_back(777);
    test.push_back(321);
    test.push_back(111);
    test.push_back(12);
    test.push_back(1000);

    std::cout << test.front() << '\n';
    std::cout << test.back() << '\n';
    std::cout << "==========" << '\n';

    auto [min_it,max_it] = std::minmax_element(std::begin(test),std::end(test));
    std::cout << *min_it << " - " << *max_it << '\n';

    auto [min_it1,max_it1] = std::minmax_element(std::rbegin(test),std::rend(test));
    std::cout << *min_it1 << " - " << *max_it1 << '\n';

    auto [min_it2,max_it2] = std::minmax_element(std::cbegin(test),std::cend(test));
    std::cout << *min_it2 << " - " << *max_it2 << '\n';    

    Deque<int>::const_iterator cIter;
    std::cout << "The const itr deque is: ( ";
    for (cIter = test.cbegin(); cIter != test.cend(); ++cIter)
    {
        std::cout << *Iter << " ";
    }
    std::cout << ")." << std::endl;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)