c++
c++공부(list iterator 구현)
이야기prog
2025. 3. 7. 01:09
#include <iostream>
using namespace std;
template<typename T>
class Node {
public:
Node(): next_(nullptr), prev_(nullptr), data_(T()) {}
Node(const T& data): next_(nullptr), prev_(nullptr), data_(data) {}
public:
Node* next_;
Node* prev_;
T data_;
};
template<typename T>
class Iterator {
public:
Iterator() : node_(nullptr) {}
Iterator(Node<T>* node): node_(node) {}
Iterator& operator++() {
node_ = node_->next_;
return *this;
}
Iterator operator++(int) {
Iterator<T> tmp = *this;
node_ = node_->next_;
return tmp;
}
Iterator& operator--() {
node_ = node_->prev_;
return *this;
}
Iterator operator--(int) {
Iterator<T> tmp = *this;
node_ = node_->prev_;
return tmp;
}
T& operator*() {
return node_->data_;
}
bool operator==(const Iterator& val) {
return node_ == val.node_;
}
bool operator!=(const Iterator& val) {
return node_ != val.node_;
}
public:
Node<T>* node_;
};
template<typename T>
class List {
public:
List() : size_(0) {
header_ = new Node<T>();
header_->next_ = header_;
header_->prev_ = header_;
}
~List() {
Node<T>* prev = header_->prev_;
for (int i = 0; i < size_; ++i) {
Node<T>* tmpPrev = prev->prev_;
delete prev;
prev = tmpPrev;
}
delete header_;
}
void push_back(const T& val) {
AddNode(header_, val);
}
Node<T>* AddNode(Node<T>* before, const T& value) {
Node<T>* tmp = new Node<T>(value);
Node<T>* prev = before->prev_;
prev->next_ = tmp;
tmp->prev_ = prev;
tmp->next_ = before;
before->prev_ = tmp;
size_++;
return tmp;
}
void pop_back() {
RemoveNode(header_->prev_);
}
Node<T>* RemoveNode(Node<T>* node) {
Node<T>* prev = node->prev_;
Node<T>* next = node->next_;
prev->next_ = next;
next->prev_ = prev;
delete node;
size_--;
return next;
}
int size() { return size_; }
public:
Node<T>* header_;
int size_;
public:
typedef Iterator<T> iterator;
iterator begin() { return iterator(header_->next_); }
iterator end() { return iterator(header_); }
iterator insert(iterator iter, const T& value) {
return iterator(AddNode(iter.node_, value));
}
iterator erase(iterator iter) {
return iterator(RemoveNode(iter.node_));
}
};
int main() {
List<int> li;
List<int>::iterator eraseIt;
for (int i = 0; i < 10; i++) {
if (i == 5) {
eraseIt = li.insert(li.end(), i);
}
else {
li.push_back(i);
}
}
li.pop_back();
li.erase(eraseIt);
for (List<int>::iterator it = li.begin(); it != li.end(); ++it) {
std::cout << *it << std::endl;
}
return 0;
}