【问题标题】:Iterators for custom datastructure自定义数据结构的迭代器
【发布时间】:2017-08-25 02:35:40
【问题描述】:

在与迭代器和容器相处时,我偶然发现了一个我正在尝试实施的小实验。但是,我很早就被卡住了。

这个想法是创建一个链表,其中包含两种不同类型的条目,即 out 和 in 项。所有项目都链接在一起,而同类项目也包含相互引用。

接下来,我希望能够通过迭代器以三种不同的方式循环数据结构:

  1. 任何,其中遍历整个数据结构。
  2. In,其中仅遍历 in 项。
  3. Out,仅遍历 out 项。

所以当调用上面列出的任何类型时,只有一个 begin() 和 end() 迭代器被传递给请求者。

我已经为以下数据结构设置了一个,我可以按照上面提到的方式循环它,虽然我不能设置迭代器。

template <class T>
struct dual_node {
    /*
     * Constructors
     */
    dual_node(T data): data(data) {};

    /*
     * Operators
     */
    bool operator ==(const dual_node<T> &rhs) const {
        return this->data == rhs.data;
    }

    /*
     * Members
     */
    T data;
    dual_node *type_next = nullptr;
    dual_node *type_prev = nullptr;
};

包装类:

using namespace std;

template <class T>
class DualLinkedList {
public:
    /*
     * Mutators
     */
    template <class Direction>
    void push_front(T element){
        elements.push_front(dual_node<T>(element));
        Direction::template set_ptr<T>(elements.front(), &last_in, &last_out);
    }

    void remove(T element){
        auto it = find(elements.begin(), elements.end(), element);

        // Element found
        if(it != elements.end()){
            // If it has a previous
            if(it->type_prev) {
                it->type_prev->type_next = it->type_next;
            }else{
                // No previous, so last_in or last_out should match.
                if(*last_in == *it){
                    last_in = it->type_next;
                }

                if(*last_out == *it){
                    last_out = it->type_next;
                }
            }

            // Remove from forward_list
            elements.remove(*it);
        }


    }
//private:
    forward_list<dual_node<T>> elements;
    dual_node<T> *last_in;
    dual_node<T> *last_out;
};

方向类:

struct in {
        static edge_list& get_list(pair<edge_list, edge_list> &a) {
            return a.first;
        }
        // conceptual
        static pair<iterator, iterator> get_it_pair(dual_node<T>** last_in){
            // Return iterator starting at last_in, following type_next pointers
        }

        template <class T>
        static void set_ptr(dual_node<T> &element, dual_node<T>** last_in, dual_node<T>** last_out){
            // If last incoming exists.
            if(*last_in) {
                (**last_in).type_prev = &element;
            }
            element.type_next = *last_in;
            *last_in = &element;
        }
    };

    struct out {
        static edge_list& get_list(pair<edge_list, edge_list> &a) {
            return a.second;
        }

        // conceptual
        static pair<iterator, iterator> get_it_pair(dual_node<T>** last_out){
            // Return iterator starting at last_out, following type_next ptrs
        }

        template <class T>
        static void set_ptr(dual_node<T> &element, dual_node<T>** last_in, dual_node<T>** last_out) {
            // If last outgoing exists.
            if(*last_out) {
                (**last_out).type_prev = &element;
            }
            element.type_next = *last_out;
            *last_out = &element;
        }
    };

    struct any {
        // conceptual
        static pair<iterator, iterator> get_it_pair(dual_node<T>** last_out){
            // Returning iterator starting at last out following forward_list
        }
    };

【问题讨论】:

    标签: c++ data-structures iterator containers


    【解决方案1】:

    【讨论】:

    • 是的,我做到了。问题是我想要 2 种不同类型的迭代器,但我似乎无法插入它。
    猜你喜欢
    • 2011-08-23
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多