#include <iostream>
#include <algorithm>
struct Node {
int value;
Node* next;
};
bool operator==(const Node& node, int value) { //<-- без него не компилирует
return node.value == value;
}
class NodeIterator
: public std::iterator<std::forward_iterator_tag, Node*> {
Node* node;
public:
NodeIterator():node(nullptr) { std::cout << "x"; }
NodeIterator(Node* _node):node(_node) { }
Node* getNode() const { return node; }
Node& operator*() { return *node; }
Node* operator->() { return node; }
NodeIterator& operator++() { node = node->next; return *this; }
};
bool operator==(const NodeIterator& lhs, const NodeIterator& rhs) {
return lhs.getNode() == rhs.getNode();
}
bool operator!=(const NodeIterator& lhs, const NodeIterator& rhs) {
return !(lhs == rhs);
}
int main() {
Node* head = new Node();
head->value = 100;
Node* node1 = new Node();
node1->value = 101;
head->next = node1;
Node* node2 = new Node();
node2->value = 102;
node1->next = node2;
node2->next = nullptr;
NodeIterator headIterator(head);
NodeIterator pos = std::find(headIterator, NodeIterator(), 102);
if (pos != NodeIterator())
std::cout << pos->value << std::endl;
else
std::cout << "not found" << std::endl;
NodeIterator tmp;
for (tmp ; headIterator != NodeIterator(); )
{
tmp = headIterator;
++headIterator;
delete tmp.getNode();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKc3RydWN0IE5vZGUgewogICAgaW50IHZhbHVlOwogICAgTm9kZSogbmV4dDsKfTsKIApib29sIG9wZXJhdG9yPT0oY29uc3QgTm9kZSYgbm9kZSwgaW50IHZhbHVlKSB7IC8vPC0tINCx0LXQtyDQvdC10LPQviDQvdC1INC60L7QvNC/0LjQu9C40YDRg9C10YIKICAgIHJldHVybiBub2RlLnZhbHVlID09IHZhbHVlOwp9CiAKY2xhc3MgTm9kZUl0ZXJhdG9yCiAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIE5vZGUqPiB7CiAKICAgIE5vZGUqIG5vZGU7CnB1YmxpYzoKICAgIE5vZGVJdGVyYXRvcigpOm5vZGUobnVsbHB0cikgeyBzdGQ6OmNvdXQgPDwgIngiOyB9CiAgICBOb2RlSXRlcmF0b3IoTm9kZSogX25vZGUpOm5vZGUoX25vZGUpIHsgfQogICAgTm9kZSogZ2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG5vZGU7IH0KIAogICAgTm9kZSYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKm5vZGU7IH0KICAgIE5vZGUqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBub2RlOyB9CiAgICBOb2RlSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IG5vZGUgPSBub2RlLT5uZXh0OyByZXR1cm4gKnRoaXM7IH0KfTsKIApib29sIG9wZXJhdG9yPT0oY29uc3QgTm9kZUl0ZXJhdG9yJiBsaHMsIGNvbnN0IE5vZGVJdGVyYXRvciYgcmhzKSB7CiAgICByZXR1cm4gbGhzLmdldE5vZGUoKSA9PSByaHMuZ2V0Tm9kZSgpOwp9CiAKYm9vbCBvcGVyYXRvciE9KGNvbnN0IE5vZGVJdGVyYXRvciYgbGhzLCBjb25zdCBOb2RlSXRlcmF0b3ImIHJocykgewogICAgcmV0dXJuICEobGhzID09IHJocyk7Cn0KIAppbnQgbWFpbigpIHsKIAogICAgTm9kZSogaGVhZCA9IG5ldyBOb2RlKCk7CiAgICBoZWFkLT52YWx1ZSA9IDEwMDsKIAogICAgTm9kZSogbm9kZTEgPSBuZXcgTm9kZSgpOwogICAgbm9kZTEtPnZhbHVlID0gMTAxOwogICAgaGVhZC0+bmV4dCA9IG5vZGUxOwogCiAgICBOb2RlKiBub2RlMiA9IG5ldyBOb2RlKCk7CiAgICBub2RlMi0+dmFsdWUgPSAxMDI7CiAgICBub2RlMS0+bmV4dCA9IG5vZGUyOwogCiAgICBub2RlMi0+bmV4dCA9IG51bGxwdHI7CiAKICAgIE5vZGVJdGVyYXRvciBoZWFkSXRlcmF0b3IoaGVhZCk7CiAgICBOb2RlSXRlcmF0b3IgcG9zID0gc3RkOjpmaW5kKGhlYWRJdGVyYXRvciwgTm9kZUl0ZXJhdG9yKCksIDEwMik7CiAKICAgIGlmIChwb3MgIT0gTm9kZUl0ZXJhdG9yKCkpCiAgICAgICAgc3RkOjpjb3V0IDw8IHBvcy0+dmFsdWUgPDwgc3RkOjplbmRsOwogICAgZWxzZQogICAgICAgIHN0ZDo6Y291dCA8PCAibm90IGZvdW5kIiA8PCBzdGQ6OmVuZGw7CiAKIAlOb2RlSXRlcmF0b3IgdG1wOwogIAlmb3IgKHRtcCA7IGhlYWRJdGVyYXRvciAhPSBOb2RlSXRlcmF0b3IoKTsgKQogIAl7CiAgCSAgdG1wID0gaGVhZEl0ZXJhdG9yOwkKICAJICArK2hlYWRJdGVyYXRvcjsKICAgICAgZGVsZXRlIHRtcC5nZXROb2RlKCk7CiAgCX0KICAgCiAgICByZXR1cm4gMDsKfQ==