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;
}