自定义@@iterator

@@iterator是一个可以返回迭代器对象的函数。

调用迭代器的next()方法会返回形式为{value: .. , done: ..} 的值, value是当前的遍历值, done是一个布尔值, 表示遍历是否结束。

var obj = {
    a: 2,
    b: 3
}

Object.defineProperty(obj, Symbol.iterator, {
    writeable: false,
    enumerable: false,
    configurable: true,
    value: function() {
        let o = this,
            index = 0,
            keys = Object.keys(o);
        return {
            next: function() {
                return {
                    value: o[keys[index++]],
                    done: index > keys.length
                }
            }
        }
    }
})

let it = obj[Symbol.iterator]();
console.log(it.next());
console.log(it.next());
console.log(it.next());

// for .. of 会寻找内置或者自定义的@@iterator对象并调用它的next()方法来遍历数据值。
for(let k of obj) {
    console.log(k);
}

 

首先,我们需要定义一个节点类 Node,它包含一个数据成员和一个指向下一个节点的指针: ``` template<typename T> class Node { public: T val; Node<T>* next; Node(T v): val(v), next(nullptr) {} }; ``` 然后,我们定义一个链表类 LinkedList,它包含一个指向头节点的指针和链表长度: ``` template<typename T> class LinkedList { public: LinkedList(): head(nullptr), len(0) {} void insert(T val) { Node<T>* node = new Node<T>(val); node->next = head; head = node; len++; } int size() { return len; } private: Node<T>* head; int len; }; ``` 接下来,我们需要实现一个迭代器类 Iterator,它包含一个指向当前节点的指针和一个指向链表的指针: ``` template<typename T> class Iterator { public: Iterator(Node<T>* node, LinkedList<T>* list): cur(node), linkedList(list) {} T operator*() { return cur->val; } Iterator<T>& operator++() { cur = cur->next; return *this; } bool operator!=(const Iterator<T>& other) { return cur != other.cur || linkedList != other.linkedList; } private: Node<T>* cur; LinkedList<T>* linkedList; }; ``` 最后,我们在 LinkedList 类中实现 begin 和 end 方法,返回一个迭代器: ``` template<typename T> class LinkedList { public: LinkedList(): head(nullptr), len(0) {} void insert(T val) { Node<T>* node = new Node<T>(val); node->next = head; head = node; len++; } int size() { return len; } Iterator<T> begin() { return Iterator<T>(head, this); } Iterator<T> end() { return Iterator<T>(nullptr, this); } private: Node<T>* head; int len; }; ``` 现在,我们就可以使用自定义链表及其迭代器了: ``` LinkedList<int> list; list.insert(1); list.insert(2); list.insert(3); for (Iterator<int> it = list.begin(); it != list.end(); ++it) { cout << *it << endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值